繁体   English   中英

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

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

在我看来,这应该非常简单:我有一个字符串列表,我只想返回数据库行,其中列与列表中包含的所有字符串相匹配。

因此,例如,如果我的字符串搜索查询是{ "R", "E", "I" }它应该返回 MyStringColumn 列中包含字母 R、E 和 I 的所有记录(以任何顺序)。

代码示例:

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

不幸的是,这会返回以下错误:

System.InvalidOperationException。 无法翻译 LINQ 表达式“DbSet().Where(c => __reiks_0.All(r => c.MyStringColumn.Contains(r)))”。 以可以翻译的形式重写查询,或者通过插入对“AsEnumerable”、“AsAsyncEnumerable”、“ToList”或“ToListAsync”的调用来显式切换到客户端评估。

如果我像这样重写代码它就可以工作,但这只是一个临时解决方案,因为我不能保证只有 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]))));

我究竟做错了什么? 我还使用 Any 而不是All尝试了第一个代码示例,但无论哪种方式都不起作用。

您可以像这样分解条件:

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();

试试这个:

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