gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:10:22 24 4
gpt4 key购买 nike

我正在研究 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com