如何使用ToDictionary将查询结果转换为字典

时间:2017-12-27 00:53:52

标签: c# entity-framework linq dictionary

我在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类的Est​​ados属性是一个Dictionary,我需要在其中存储关键字EstadoNombre的字典,其中包含查询结果中记录总和的值。

1 个答案:

答案 0 :(得分:0)

LINQ to Entities将您的LINQ表达式转换为SQL语句(或基于您的提供程序的任何其他内容),以获取所需的数据。但是,并非所有表达式都可以轻松地转换为SQL(即ToDictionary函数调用),这就是运行时抱怨的原因。

因此,在使用任何无法识别的表达式之前,您必须实现您的查询(即从数据库中获取数据并将其转换为对象)。

为此,您只需致电ToList()上的IQueryable以获取查询中的对象列表,然后您就可以致电{{1}在那个对象列表上。

我没有测试下面的代码,但它描绘了这个想法。

ToDictionary
相关问题