C# 包含值和值列表的属性上的EFCore筛选器

C# 包含值和值列表的属性上的EFCore筛选器,c#,linq,ef-core-5.0,C#,Linq,Ef Core 5.0,我试图根据实体上特定字段中的搜索值列表筛选实体 例如: var searchValues = new List<string> { "abc", "xyz" }; var posts = Context.Posts .Where(p => searchValues.Any(v => p.Title.Contains(v))) .ToList(); var searchValues=新列表{“abc”,“xyz”};

我试图根据实体上特定字段中的搜索值列表筛选实体

例如:

var searchValues = new List<string> { "abc", "xyz" };
var posts = Context.Posts
    .Where(p => searchValues.Any(v => p.Title.Contains(v)))
    .ToList();
var searchValues=新列表{“abc”,“xyz”};
var posts=Context.posts
.Where(p=>searchValues.Any(v=>p.Title.Contains(v)))
.ToList();
这会生成一个异常“无法翻译LINQ表达式。请以可以翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsAsAsAsyncEnumerable”、“ToList”或“ToListSync”的调用显式切换到客户端计算”


应用包含多个搜索值的筛选器的正确方法是什么?

如果您将帖子转换为应该使用的位置之前的列表

var posts = Context.Posts.ToList()
.Where(p => searchValues.Any(v => p.Title.Contains(v)));
这样,过滤器就不必翻译成SQL(或您正在使用的任何db)


需要注意的是,所有POST数据都将加载到内存中以生成列表。这可能是可接受的,也可能是不可接受的,具体取决于POST和数据库调用的数量。

上下文中的p.Posts from v在searchValues中,其中p.Title.包含(v)选择p
是否有使用扩展方法语法的等效方法?当然。编译器始终会将查询表达式语法转换为方法语法。您应该对这两种语法都很熟悉。我们根本不使用查询语法-您能帮助使用工作方法语法吗?谢谢。您应该在n更容易阅读。
Context.Posts.SelectMany(p=>searchValues.Where(v=>p.Title.Contains(v)).Select(v=>p))
的可读性要差得多。您应该学会理解两者。这会起作用,但您至少应该警告其影响。@AluanHaddad done!当然-我知道在内存中处理该筛选器的能力,但出于数据量和性能考虑,这不是一个理想的选择。我们只使用扩展方法语法,因此如果有人能帮上忙,我会很感激的。