我需要在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() })};
}
你能指出我哪里出错吗?它不会给出任何编译错误,但它不会返回任何内容
提前感谢
答案 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();
当然,更好的解决方案是删除匿名类型并使用带有YourDataType
和Text
字段/属性的显式类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();