查询中的可空值

时间:2010-03-23 14:47:54

标签: linq-to-sql nullable

我需要获取所有没有类别的项目

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

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 ) );