我遇到以下方法的问题:
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
没有返回任何东西?
答案 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))