在linq中使用lambda表达式的正确方法

时间:2014-11-03 16:43:41

标签: c# linq lambda

问题:我想根据我方法的输入在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)))

这显然会导致很多性能问题。我做错了什么?

1 个答案:

答案 0 :(得分:2)

问题的存在是因为c#和大多数数据库处理空值的区别。在C#中,null == null为true,而在大多数数据库中,null == null将返回false(或未知)。 LINQ正在尝试编写一个匹配C#的null值思想的SQL查询。由于您的字段可以为空,并且您可以要求Firstname为null的所有记录,这是有道理的。如果您不希望Firstname可以为空,那么您应该将其设为NOT NULL字段,LINQ将为您生成更简单的查询。

或者,您可以将上下文对象的UseDatabaseNullSemantics属性设置为true,它将简化您的查询,但是您将无法请求Firstname为null的记录。