看起来像愚蠢的问题,但我只是不明白。 我的实体:
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
我想念什么?
答案 0 :(得分:10)
我相信一些LINQ提供商在null之间存在一种奇怪的现象。尝试:
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
部分( literal null)强制转换为ISNULL
或SQL等价物。
我同意这是一种痛苦,而其他人可能会有更好的解决方法,但这可能有助于你开始。
答案 1 :(得分: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-to-entities提供商没有比较正确的事情。
答案 2 :(得分:1)
试试这个(根据gdoron的评论修改。现在正是gideon发布的,所以请接受他而不是我的):
int? test = null;
if(test.HasValue) {
db.Pages.First(x => x.ParentId == test.Value);
} else {
db.Pages.First(x => x.ParentId == null);
}