LINQ 表达式 - 使用 .Any in s Select 无法翻译
Posted
技术标签:
【中文标题】LINQ 表达式 - 使用 .Any in s Select 无法翻译【英文标题】:LINQ Expression - Using .Any in s Select Could Not Be Translated 【发布时间】:2020-05-09 11:18:12 【问题描述】:Asp.net Core 3.1 LINQ Expression group by 并从表中选择,我使用 any into select 但出现错误。
但它在 asp.net 标准中运行良好。
代码:
List<GetObj> liste = dbContext.testTable
.Where(x => x.isActive == true).OrderByDescending(x => x.Id)
.GroupBy(x => new x.field1, x.field2 )
.Select(x => new GetObj
field1 = x.Key.field1,
field2 = x.Key.field2,
totalQuantity = x.Sum(y => y.ldNet),
isMaped = x.Any(y => y.isLastMove == true)
).ToList();
结果错误是:
.Any(y => y.isLastMove == True)' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to either AsEnumerable(), AsAsyncEnumerable(), ToList(), or ToListAsync().
【问题讨论】:
错误中的True
与代码中的true
大小写不同吗?
No 这没有任何作用。
嘿,您还可以通过使用诸如 from、where、orderby、group by 等 C# 关键字实现查询来提高查询效率。像这样:from table in dbContext.testTable where table.isActive == true orderby table.Id descedning group new table.ldNet, table.isLastMove by new table.field1, table.field2 into tableGrp select new GetObj field1 = x.Key.field1, field2 = x.Key.field2, totalQuantity = tableGrp.Sum(x => x.ldNet), isMaped = tableGrp.Max(x => x.isLastMove)
如果您对不同的列使用 orderby,您也可以为其添加索引。
【参考方案1】:
目前(EF Core 3.x)只有键/标量聚合的投影是supported for GroupBy queries,而Any
不属于该类别。
有点不寻常,不那么可读,但是由于Any
返回false
如果所有元素条件都是false
,而且true > false
,Any
可以替换为支持的Max
聚合:
isMaped = x.Max(y => y.isLastMove)
【讨论】:
感谢 Ivan Stoev 我明白了,这种方式可能不可读但很短,您有什么建议可以解决这个问题。 @sadullahzolfqar 这是你原来的问题的解决方案,你还需要什么建议?以上是关于LINQ 表达式 - 使用 .Any in s Select 无法翻译的主要内容,如果未能解决你的问题,请参考以下文章
LINQ体验——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains