2012-02-14 63 views
6

看起來像一個愚蠢的問題,但我只是不明白。 我的實體:Linq表達式可爲空

public class Page 
{ 
    public int Id { get; set; } 
    //... 
    public int? ParentId { get; set; } 
} 

在控制器:

db.Pages.First(x => x.ParentId == null); 

按預期方式工作(返回一些元素)。 但是:

int? test = null; 
db.Pages.First(x => x.ParentId == test); 

拋出Sequence contains no elements

我怎麼錯過?

+1

你在使用linq-to-entities嗎?這與asp.net-mvc沒有任何具體關係? – gideon 2012-02-14 09:56:57

回答

10

我相信在一些LINQ提供者的空值處有一個奇怪的地方。嘗試:

var query = db.Pages.First(x => (test != null && x.ParentId == test) || 
           (test == null && x.ParentId == null)); 

或者,使用不同的查詢對於不同的情況:

var query = test == null ? db.Pages.First(x => x.ParentId == null) 
         : db.Pages.First(x => x.ParentId == test); 

基本上,這是因爲SQL把NULL作爲不平等本身,所以:

WHERE X = Y 

仍然會失敗如果X和Y都是空值。使用== null部分(與文字爲空)強制轉換爲ISNULL或任何SQL等效項。

我同意這是一個痛苦,而其他人可能有更好的解決方法,但這可能會幫助你開始。

+2

_better workaround_移動到一個體面的LINQ提供商,凌NH ... – gdoron 2012-02-14 10:07:11

1

試試這個(根據gdoron的評論修改現在基甸貼什麼,所以請接受他,而不是我的):

int? test = null; 
if(test.HasValue) { 
    db.Pages.First(x => x.ParentId == test.Value); 
} else { 
    db.Pages.First(x => x.ParentId == null); 
} 
+2

將無法​​正常工作。 Value - 如果HasValue屬性爲true,則表示當前Nullable(Of T)對象的值。 ==>如果HasValue屬性爲false,則拋出異常。 <==' – gdoron 2012-02-14 10:01:12

+0

是的,謝謝你的提示。 – 2012-02-14 10:03:32

+0

thx這個解決方案,但我只是想了解,奇怪的LINQ – Wonder 2012-02-14 10:12:22

2

你可以做這樣的事情作爲一種解決方法:

int? test = null; 
if(test.HasValue) { 
db.Pages.First(x => x.ParentId == test.Value); 
} else { 
db.Pages.First(x => x.ParentId == null); 
} 

因爲int?我假設其實是一個Nullable<int>我們的LINQ到實體提供者沒有比較正確的事情。