【发布时间】:2021-06-02 04:05:17
【问题描述】:
要在实体上实现基本搜索功能,我想检查多个字段中的至少一个是否包含所有提供的搜索词。
为了说明,假设我的实体是一个Furniture,有两个字符串字段Name 和Description,我的数据库中有以下条目:
ID | Name | Description
---|----------------|------------
1 | Black chair 1 | Black chair
-> 2 | Red chair 1 | Crimson chair
-> 3 | Red chair 2 | Dark red chair
-> 4 | Black chair 2 | Black straight back chair, red cushion
5 | Blue sofa | Blue sofa
6 | Red sofa | Red sofa
并且我想检索其中任何字段包含两个单词 red 和 chair 的所有实体(这里是 2、3 和 4)。
我可以这样写:
var search = new[] { "red", "chair" };
var filtered = _db.Furnitures.AsNoTracking().Where(f => {
search.All(s => f.Name.ToLower().Contains(s))
|| search.All(s => f.Description.ToLower().Contains(s))
});
但 EF Core 警告我,这无法转换为 SQL,并且将在本地进行评估。
有什么方法可以编写此查询以便在 SQL 中对其进行评估?
注意:这是我所面临问题的简化示例,模型显然很荒谬,所以请不要建议更改我的实体 :)
【问题讨论】:
-
一般情况下,当 C# 函数没有对应的 SQL 翻译时,会出现此警告消息。我在
Entity Framework 6中测试过,这可行,但不确定为什么在 EF Core 中不起作用。也许 EF Core 无法将.All函数与相应的数据库函数进行转换。