2010-06-17 76 views
3

嘿 - 簡單的查詢:DB4O Linq查詢 - 如何檢查空字符串

var q = (from SomeObject o in container 
    where 
o.SomeInt > 8 
&& o.SomeString != null //Null Ref here 
    select o; 

我總是得到一個空引用異常。

如果我使用String.IsNullOrEmpty(o.SomeString)查詢需要大約100倍長,好像我用& & o.SomeString!=「」(這是更快的方式,但顯然不正確)。

我在猜測,因爲DB4o需要激活對象,以便將它們傳遞給IsNullOrEmpty調用,並且不能使用索引。

我的問題是,有什麼更好的方法來檢查在這種情況下的空值?有沒有這樣的東西:mystring!= Db4o.DBNull.Value,或者什麼?

乾杯,戴夫

回答

3

其實您的查詢應該沒有任何問題。你的查詢應該運行良好。它也不應該需要任何激活。 db4o嘗試translate the queries into SODA-Queries並避免激活對象。

您正在使用哪個版本的db4o?在LINQ-Queries中有a bug which引起了NullRefrence-Exception。它應該是固定的。

您是否已將Db4objects.Db4o.Linq.dll程序集添加到您的項目中。單組件是否存在?

我會盡量避免使用String.IsNullOrEmpty,因爲我會阻止查詢優化。只要你用查詢調用複雜的方法,優化器就無法將查詢轉換爲SODA。然後你基本上LINQ運行到對象,這對大數據集來說會很慢。

+0

嘿 - 謝謝你的回覆,你對這個Db4o的東西很有幫助。非常感謝。 我剛剛升級所有DLL的最新版本,現在查詢運行 - 但是我的索引沒有再工作。 *嘆息* 我已經啓用了日誌記錄到控制檯,並且我沒有收到關於缺少索引的任何消息(正如你在我的早期文章中幫助過我的)。 任何想法? :( 乾杯,戴夫 嗯 – 2010-06-17 14:20:59

+0

這是奇怪的。你看到在輸出窗口在視覺工作室任何新的「Db4objects.Db4o.Linq.QueryOptimizationException」?這將表明,查詢不再優化。 檢查你是否在'Db4objects.Db4o.Linq.dll'組件中有'Mono.Reflection.dll',如果你切換到8.0 beta版本。這是一個新的依賴項,而不是Cecil-assemblies。 Anyway ,這很奇怪,應該調查 – Gamlor 2010-06-17 14:40:45

+0

我正在使用最新的v7 Dll's,我已經升級到測試版,現在一切似乎都好了,再次感謝您的幫助 Dave – 2010-06-17 15:38:08