简体   繁体   English

LINQ / EF Core 无法在查询中使用字符串。包含

[英]LINQ / EF Core cannot use string.Contains in query

In my opinion this should be pretty straight forward: I have a list of strings and I want to return only the db rows, where the column matches all of the strings contained in the list.在我看来,这应该非常简单:我有一个字符串列表,我只想返回数据库行,其中列与列表中包含的所有字符串相匹配。

so for instance, if my string search query is { "R", "E", "I" } it should return all records that contain the letters R, E and I in the column MyStringColumn (in any order).因此,例如,如果我的字符串搜索查询是{ "R", "E", "I" }它应该返回 MyStringColumn 列中包含字母 R、E 和 I 的所有记录(以任何顺序)。

Code Example:代码示例:

var reiks = new List<string> { "R", "E", "I" };
var result = _context.MyTable.Where(x => reiks.All(r => x.MyStringColumn.Contains(r)));

Unfortunately, this returns the following error:不幸的是,这会返回以下错误:

System.InvalidOperationException. System.InvalidOperationException。 The LINQ expression 'DbSet().Where(c => __reiks_0.All(r => c.MyStringColumn.Contains(r)))' could not be translated.无法翻译 LINQ 表达式“DbSet().Where(c => __reiks_0.All(r => c.MyStringColumn.Contains(r)))”。 Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'.以可以翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端评估。

If I rewrite the code like this it works, but this is only a temporary solution, as I cannot guarantee that there will only be 3 strings:如果我像这样重写代码它就可以工作,但这只是一个临时解决方案,因为我不能保证只有 3 个字符串:

var result = _context.MyTable.Where(x => ((reiks.Count == 0 || x.MyStringColumn.Contains(reiks[0])) && (reiks.Count <= 1 || x.MyStringColumn.Contains(reiks[1])) && (reiks.Count <= 2 || x.MyStringColumn.Contains(reiks[2]))));

What am I doing wrong?我究竟做错了什么? I also tried the first code example with Any instead of All , but it didn't work either way.我还使用 Any 而不是All尝试了第一个代码示例,但无论哪种方式都不起作用。

You can break down the condition like:您可以像这样分解条件:

var reiks = new List<string> { "R", "E", "I" };
var query = _context.MyTable.AsQueryable();
foreach(var reik in reiks)
{
    query = query.Where(x => x.MyStringColumn.Contains(reik));
}
var result = query.ToList();

Try this: 试试这个:

var result = _context.MyTable.AsEnumerable()
                             .Where(x => reiks.All(r => x.MyStringColumn.Contains(r)));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM