【发布时间】:2020-12-23 04:28:55
【问题描述】:
我有一个简单的实体框架 LINQ 查询。目标是找到所有以 A、B 或 C 开头的运营商:
var letters = new List<string>() { "A", "B", "C" }; // Dynamic, can be many
var results = db.Carriers.AsNoTracking()
.Where(c => letters.Any(val => c.Name.StartsWith(val)))
.ToList();
我明白了
System.InvalidOperationException: 'LINQ 表达式 'DbSet .Where(c => __letters_0 .Any(val => val == "" || c.Name != null && val != null && c.Name.StartsWith(val)))' 无法翻译。以可翻译的形式重写查询,或通过插入对 AsEnumerable()、AsAsyncEnumerable()、ToList() 或 ToListAsync() 的调用显式切换到客户端评估。请参阅https://go.microsoft.com/fwlink/?linkid=2101038 了解更多信息。'
有没有办法做到这一点?
【问题讨论】:
-
试试:
c.Name.Substring(0, val.Length).Equals(val) -
试试
.Where(c => letters.Contains(c.Name[0].ToString())) -
应该可以的。
-
感谢 cmets @iSR5 和 @Alexander Petrov,这两个建议都没有按原样工作,但我能够将它们组合成
letters.Contains(c.Carrier.Name.Substring(0, 1),这似乎有效。问题是它只能使用 1 个字母,并且没有 StartsWith 的灵活性
标签: c# .net linq entity-framework-core