我需要获取所有没有类别的项目
int? categoryId = null;
var items=db.Items.Where(x=>x.CategoryId==categoryId);
此代码生成于:
where CategoryId=null
而不是
where CategoryId is null
好的,我写的时候
var items=db.Items.Where(x=>x.CategoryId==null);
在我的sql profiler中,它可以工作:
where CategoryId is null
但是当我这样做时,黑客它不起作用:
var items=db.Items.Where(x=>x.CategoryId==(categoryId.HasValue ? categoryId : null));
那么问题是什么?在L2S中有吗?
更新:如果categoryId有值,则需要返回如下内容:
where CategoryId = 1
答案 0 :(得分:2)
您可以尝试:
var items = db.Items.Where( x => !x.CategoryId.HasValue );
第一个示例的问题是LINQ在构建表达式时不会查看变量的值。它只是看到和等式表达式并将其转换为SQL中的等效表达式。 LINQ要求开发人员了解并了解它在检查空值方面的工作原理。我认为我给你的是最简单的方法。
修改:根据您的评论。如果您要查找categoryId的匹配项,或者如果categoryId没有值,则可以构建空类别id。这将是将许多潜在查询链接在一起的一种方式 - 并且可能忽略在某些情况下您不关心的某些比较。
IQueryable<Item> items = db.Items;
if (categoryId.HasValue)
{
items = items.Where( x => x.CategoryId == categoryId );
}
else
{
items = items.Where( x => !x.CategoryId.HasValue );
}
或者(对于你的简单情况),使用object.Equals
似乎会使LINQ to SQL表达式构建器在值为null时实现IS NULL。
var item = db.Items.Where( x => object.Equals( x.CategoryId, categoryId ) );