我在EF中有这个查询:
var data = db.Inventario.Where(i => i.ClienteId.Equals(Global.ClienteID))
.GroupBy(i => new { Tipo = i.Tipo.TipoNombre, Zona = i.Localidad.Zona.ZonaNombre, Localidad = i.Localidad.LocalidadNombre })
.Select(i => new Registro()
{
Tipo = i.Key.Tipo,
Zona = i.Key.Zona,
Localidad = i.Key.Localidad,
Estados = i.SelectMany(ei => ei.EstadoInventario)
.GroupBy(ei => ei.Estado.EstadoNombre)
.AsEnumerable()
.ToDictionary(ei => ei.Key, ei => ei.Sum(item => item.EstadoInventarioValor ? 1 : 0))
});
this.Data = data.ToList();
当我运行它时,会发生以下错误:
LINQ to Entities无法识别该方法 ' System.Collections.Generic.Dictionay`2 [System.String,System.Int32] ToDictionary [IGrouping`2,字符串,的Int32](System.Collections.Generic.IEnumerable`1 [System.Linq.IGrouping`2 [System.String,Data.EstadoInventario]] System.Func`2 [System.Linq.IGrouping`2
Registro类的Estados属性是一个Dictionary,我需要在其中存储关键字EstadoNombre的字典,其中包含查询结果中记录总和的值。
答案 0 :(得分:0)
LINQ to Entities将您的LINQ表达式转换为SQL语句(或基于您的提供程序的任何其他内容),以获取所需的数据。但是,并非所有表达式都可以轻松地转换为SQL(即ToDictionary
函数调用),这就是运行时抱怨的原因。
因此,在使用任何无法识别的表达式之前,您必须实现您的查询(即从数据库中获取数据并将其转换为对象)。
为此,您只需致电ToList()
上的IQueryable
以获取查询中的对象列表,然后您就可以致电{{1}在那个对象列表上。
我没有测试下面的代码,但它描绘了这个想法。
ToDictionary