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 =&gt; x.ldNet), isMaped = tableGrp.Max(x =&gt; x.isLastMove) 如果您对不同的列使用 orderby,您也可以为其添加索引。 【参考方案1】:

目前(EF Core 3.x)只有键/标量聚合的投影是supported for GroupBy queries,而Any 不属于该类别。

有点不寻常,不那么可读,但是由于Any返回false如果所有元素条件都是false,而且true &gt; falseAny可以替换为支持的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

无法翻译 LINQ 表达式 DbSet<>.Any

LINQ to SQL语句之Exists/In/Any/All/Contains

sql语句-linq语言-lambda表达式对照

Python:any() / all() 中的惰性函数求值

LINQ 学习路程 -- 查询操作 Expression Tree