2013-10-10 62 views
4

使用组I需要获得在一个列表中的以下输出,我使用MVC4和C#。 基本上我需要执行的查询是:通过并计数lambda表达式

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() })}; 
    } 

你能指出我在哪里,我错了?它不提供任何编译错误,但是它不返回任何东西

Thankd提前

回答

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(); 
    } 
4

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

此执行你的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(); 

当然,更好的办法是放弃匿名类型和使用一个明确的类YourDataTypeTextValue域/属性。然后,你可以简单地返回一个List<YourDataType>

+0

谢谢。不过我测试,它要求我将其转换为新的返回列表。我做到了,它仍然无法正常工作。也许问题在伯爵? – N8K8

+1

@ user2865100:更新了我的答案。 – Heinzi

1

你可以改变你的返回类型从List<object>IEnumerable

BTW,List<object>等于List

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

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();