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

标签 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)))

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

最佳答案

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

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

关于c# - 在 linq 中使用 lambda 表达式的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26718807/

相关文章:

c# - 在 SQL CLR UDF 中使用 System.Linq 程序集

c# - 使用匿名类型列表填充 AutoCompleteBox

c++ - 递归函数周围的 lambda 包装器中的 this-pointer 捕获

c# - 了解 LINQ 子查询

c# - 如何从c#中的字符串中获取第二部分

c# - C# 中的隐式构造函数有什么作用?

c# - 将 XML 文件反序列化为 DTO

c# - 获取表中所有记录的样本

c# - 在线程中使用 C# 将字符串添加到 WPF 中的列表框

c++ - 如何向 lambda 函数添​​加属性?