使用group by并计算lambda表达式

时间:2013-10-10 12:28:07

标签: c# asp.net-mvc-4 lambda

我需要在List中获取以下输出,我正在使用MVC4和C#。 基本上我需要执行的查询是:

SELECT ESTADO, COUNT(*)
FROM VISITAS
WHERE CICLOID=ID
GROUP BY ESTADO;

为了实现这一点,我在我的存储库中编写了以下过程:

  public List<object> PorcentajeVisitasCiclo(Guid id)
  {
      return new List<object> {_context.Visitas
          .Where(a => a.CicloId == id)
          .GroupBy(a => a.Estado)
          .Select(n => new { Text = n.Key.Descripcion , Value = n.Count() })};
  }
你能指出我哪里出错吗?它不会给出任何编译错误,但它不会返回任何内容

提前感谢

4 个答案:

答案 0 :(得分:4)

您创建了一个包含一个元素的新List<object>,这是您的LINQ查询。这可能不是你想要的。

这将执行您的LINQ查询,然后将结果转换为列表:

return _context.Visitas.Where(a => a.CicloId == id)
    .GroupBy(a => a.Estado)
    .Select(n => new { Text = n.Key.Descripcion , Value = n.Count() }).ToList();

然而,这会产生List<yourAnonymousType>不是List<object>的子类型的问题。因此,您需要首先将您的匿名类型转换为对象:

return _context.Visitas.Where(a => a.CicloId == id)
    .GroupBy(a => a.Estado)
    .Select(n => new { Text = n.Key.Descripcion , Value = n.Count() })
    .Cast<object>().ToList();

当然,更好的解决方案是删除匿名类型并使用带有YourDataTypeText字段/属性的显式类Value。然后,您只需返回List<YourDataType>

答案 1 :(得分:4)

这可能是一种选择。我有同样的问题,并返回一个对象列表不是一个解决方案(一些LINQ错误,我不记得)。我寻求更轻松的解决方案。

public List<DummyModel> Method(int id)
    {
        return _context.Visitas.Where(a => a.CicloId == id).GroupBy(a => a.Estado).
            Select(n => new DummyModel { Name = n.Key.Descripcion, Value = n.Count() }).ToList();
    }

答案 2 :(得分:1)

您可以将退货类型从List<object>更改为IEnumerable

BTW,List<object>等于List

您可以在查询中调用ToList()扩展方法并返回对象列表。但这会强制查询立即执行,并且您将来不会使用yield return。如果您的查询返回大量数据,这很糟糕。当您拨打ToList()时,所有数据都会被加载到内存中。

答案 3 :(得分:1)

return (_context.Visitas.Where(a => a.CicloId == id)
    .GroupBy(a => a.Estado)
    .Select(n => new { Text = n.Key , Value = n.Count() })).Cast<object>().ToList();