c# - LINQ to SQL 'where' 条件中的 Lambda 表达式异常

标签 c# .net linq lambda expression-trees

我正在研究 ASP.NET MVC将存储库模式与 LINQ to SQL 结合使用的应用程序作为我的数据源。在我的存储库中,我公开了以下方法:

public IEnumerable<T> Find(Expression<Func<T, bool>> where)
{
    return _context.GetTable<T>().Where(where);
}

我可以这样调用它:

repository<User>().Find(u => true);

但如果我尝试这样做(当搜索为空时)

repository<User>().Find(u => !string.IsNullOrEmpty(search) ? u.UserName.Contains(search) : true);

我得到错误:

Value cannot be null. Parameter name: text

我认为 lambda 表达式会执行同样的事情,因为 search 的值为 null,但事实显然不是这样。

我该如何解决这个问题?

最佳答案

因为这是一个表达式,所以正常的条件运算符逻辑(不评估 false 表达式)不会自动应用。由于表达式实际上被翻译成 SQL 查询表达式,LINQ to SQL 正在评估条件的参数,在本例中它是 null。虽然 LIKE null 是有效的 SQL 语法,但显然 LINQ to SQL 不喜欢传递 null。您必须构建两个不同的查询,一个用于空术语,一个用于非空术语。

要么那样,要么将类似 string.Empty 的内容传递给 Contains。这里唯一的影响是无法在列上使用索引,因为服务器将对每一行进行重复的条件评估,从而强制进行表扫描。我建议使用两个没有条件的查询。

关于c# - LINQ to SQL 'where' 条件中的 Lambda 表达式异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3353113/

相关文章:

c#初始化int数组的更精简方法

c# - C# 视频类(class)

LINQ 计数查询返回 1 而不是 0

c# - 带有 IN 子句的 SQL 到 LINQ

c# - 根据谓词拆分字符串

javascript - HttpClient PostAsync 在 JQuery 中等效于 FormURLEncodedContent 而不是 JSON

c# - 应用程序未调用方法

c# - 除非使用嵌套使用 block ,否则 Visual Studio 无法解析类名

c# - 验证 datagridview 文本框列中的 float

c# - 如何在 div 向下滚动而不是浏览器窗口向下滚动时加载中继器?