最终投影中的集合必须是“IEnumerable<T>”考虑使用“ToList”...将“IQueryable<T>”转换为“IEnumerable<T>”

mz1*_*378 5 linq entity-framework-core

由于即使在 EF core 6 中也无法翻译组联接查询,因此我将该查询编写为相关子查询。但我收到错误:

"查询包含类型为 'IQueryable' 的投影 'c => DbSet() .Where(c2 => c2.Country == c.Country) .AsQueryable()'。最终投影中的集合必须是 'IEnumerable'类型,如“List”。考虑使用“ToList”或其他一些机制将“IQueryable”或“IOrderedEnumerable”转换为“IEnumerable”。,内部:

以下 Linq 给我带来了这个错误:

IQueryable<CoronaVirus> covids = context.CoronaViruses.AsQueryable();

IQueryable<CoronaVirusDTO> covids2 = (from c in covids
                                     let rt = context.CoronaViruses.Where(c2 => c2.Country == c.Country).AsQueryable()
                                     select new CoronaVirusDTO()
                                     {
                                         Id = c.Id,
                                         Country = c.Country,
                                         Date = c.Date,
                                         TodayCases = c.TodayCases,
                                         TodayDeaths = c.TodayDeaths,
                                         TotalCases = rt.Sum(it => it.TodayCases),
                                         TotalDeaths = rt.Sum(it => it.TodayDeaths)
                                      }).AsQueryable();
Run Code Online (Sandbox Code Playgroud)

如何更正此查询?

小智 6

子查询必须使用ToList()。不用担心,它不会生成额外的 SQL 来查询 CoronaViruses。它将被解析为 SQL WHERE 作为 linq 表达式的一部分。

另外,在上面的示例中,也许您可​​以使用 join。