为什么这个LINQ到EF查询不起作用?

时间:2012-12-08 12:20:52

标签: linq entity-framework linq-to-entities ef-code-first entity-framework-5

我遇到以下方法的问题:

public IQueryable<Customer> ListCustomers(int? parentId)
{
    Debug.Assert(parentId == null);
    //var list = _customerRepository.List().Where(c => c.ParentId == null);
    var list = _customerRepository.List().Where(c => c.ParentId == parentId);
    return list;
}

我的DB中有一个Customer,其ParentId为null。当我使用ListCustomers(null)调用方法时,list对于return语句为空。如果我将注释掉的行换成并用硬编码的null查询,那么列表包含我的一个客户。

这两个查询之间可能导致这种差异的原因是什么?为什么c.ParentId == parentId没有返回任何东西?

3 个答案:

答案 0 :(得分:1)

对于Nullable类型,linq提供程序不会生成正确的IS NULL检查。有关详细信息,请参阅此答案:https://stackoverflow.com/a/785501/1195510

答案 1 :(得分:1)

EF会将您的查询与int?翻译为以下内容:

DECLARE @parentId Int = null
SELECT ... WHERE ParentId = @parentId

当在数据库上执行此操作时,它不会按预期执行,因为在SQL [column] = NULL中始终为false。

我同意EF可以更好地处理这个问题,但作为一种解决方法,你可以写下这样的东西:

.Where( c => !parentId.HasValue
  ? !c.ParentId.HasValue 
  : c.ParentId.Value == parentId.Value
)

EF将生成一个(有点冗长的)带有正确IS NULL谓词的SQL语句。

答案 2 :(得分:0)

具有可空类型,你必须像这样使用它:

 .Where(c=> object.Equals(c.ParentId, parentId))