【发布时间】:2020-12-15 08:42:46
【问题描述】:
使用Entity Framework Core 3.1.7
我在数据库中有一个包含 Products 的表。
public class Product
{
public int Id {get; set;}
public string Name {get; set;}
}
然后我希望用户能够使用搜索字段在 UI 表中查找某些产品。 当查询进来时,我尝试执行以下操作:
var searchParameters = query.SearchParameters.ToLower().Split(' ', ',', '+').Distinct();
var result = _context.Products
.Where(p => searchParameters.Any()
&& (searchParameters.Any(x => p.Name.ToLower().Contains(x)) //Version 1
).ToList();
或替代
searchParameters.Any(x => EF.Functions.Like(p.Name, "%" + x + "%")) //Version 2
但是,我对这个看似简单的事情进行了调整:
LINQ 表达式 'DbSet .Where(p => __searchParameters_0 .Any(x => p.Name.ToLower().Contains(x)))' 无法翻译。要么以可翻译的形式重写查询, 或通过插入调用显式切换到客户端评估 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync()
我意识到.ToLower() 将是一个问题,所以我想为 SQL 查询运行一个不区分大小写的搜索的 LIKE 语句。但即便如此,List<string> 也没有被翻译。
【问题讨论】:
-
请注意,根据您的 SQL Server 设置,不区分大小写的匹配很可能是默认设置,因此您无需对搜索进行不区分大小写的翻译。
-
@NetMage 是的,谢谢!我尝试忽略 ToLower,它能够找到结果,但前提是我每个搜索参数触发一个查询,因为 .Any 不翻译。
标签: sql-server .net-core linq-to-sql entity-framework-core