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

本文关键字:方法 表达式 lambda linq | 更新日期: 2023-09-27 18:29:08

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

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

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

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

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