问题:我想根据我方法的输入在linq查询上构造一个动态where条件。
我们说我的方法接受名字,姓氏和邮政编码。用户可以选择在我的方法中传入一个或多个。
我的linq查询如下:
var query = (from employee in EmployeeDb.Employees
select employee)
//Adding firstname to where. Similarly I add other conditions.
if (request.FirstName != string.Empty)
query = query.Where(c => c.FirstName == request.FirstName);
当我希望我的SQL查询条件类似于:
WHERE [Extent6].[LastName] = @p__linq__1 AND [Extent6].[FirstName] = @p__linq__0
我实际看到的是:
WHERE (([Extent6].[LastName] = @p__linq__0) OR (([Extent6].[LastName] IS NULL) AND (@p__linq__0 IS NULL))) AND (([Extent6].[FirstName] = @p__linq__1) OR (([Extent6].[FirstName] IS NULL) AND (@p__linq__1 IS NULL)))
这显然会导致很多性能问题。我做错了什么?
答案 0 :(得分:2)
问题的存在是因为c#和大多数数据库处理空值的区别。在C#中,null == null为true,而在大多数数据库中,null == null将返回false(或未知)。 LINQ正在尝试编写一个匹配C#的null值思想的SQL查询。由于您的字段可以为空,并且您可以要求Firstname为null的所有记录,这是有道理的。如果您不希望Firstname可以为空,那么您应该将其设为NOT NULL字段,LINQ将为您生成更简单的查询。
或者,您可以将上下文对象的UseDatabaseNullSemantics属性设置为true,它将简化您的查询,但是您将无法请求Firstname为null的记录。