Linq to SQL Group by Controller
本文关键字:by Controller Group SQL to Linq | 更新日期: 2023-09-27 17:52:15
我正在学习如何编写sql查询返回记录的计数,然后通过ID分组并将其返回到列表。我已经尝试了一些事情,并不断获得不能隐式转换类型System.Collections.Generic.List<>'到'System.Linq.IQueryable..等
到目前为止,我在我的存储库中所做的尝试:
public IQueryable<CHECKLIST> GetAllComplaintsCount()
{
try
{
return _context.Checklists
.GroupBy(a => a.MonitorEnteredEmpID)
.Select(a => new { Amount = a.Sum(b =>b.MonitorEnteredEmpID), Name = a.Key })
.ToList();
}
catch (Exception ex)
{
_logger.LogError("Could not get am with checklist", ex);
return null;
}
}
如果我把它改成IEnumerable,我会得到这个错误:
Cannot implicitly convert type 'System.Collections.Generic.List<<anonymous type: int Amount, int Name>>' to 'System.Collections.Generic.IEnumerable
有人能告诉我我做错了什么,以及我如何通过EntereredEMPID返回所有清单的计数?
方法GetAllComplaintsCount()
的返回类型是IQueryable<CHECKLIST>
。但是在你的查询中,你在
.Select(a => new { Amount = a.Sum(b =>b.MonitorEnteredEmpID), Name = a.Key })
,你尝试返回这个匿名类型的List<T>
。因此,不能将其转换为IQueryable<CHECKLIST>
。
所以我猜你有一个叫做CHECKLIST
的类(或结构),它的属性叫做Amount
和Name
(当你在查询中使用它们时)。现在,不是创建匿名类型的实例,而是创建CHECKLIST
:
return _context.Checklists
.GroupBy(a => a.MonitorEnteredEmpID)
.Select(a => new CHECKLIST { Amount = a.Sum(b =>b.MonitorEnteredEmpID), Name = a.Key });
并提交.ToList()
,因为您希望返回IQueryable
而不是完成的List
。
List
,则需要将方法的签名更改为List<CHECKLIST>
,并像这样使用.ToList()
:
public List<CHECKLIST> GetAllComplaintsCount()
{
try
{
return _context.Checklists
.GroupBy(a => a.MonitorEnteredEmpID)
.Select(a => new CHECKLIST { Amount = a.Sum(b =>b.MonitorEnteredEmpID), Name = a.Key })
.ToList();
}
catch (Exception ex)
{
_logger.LogError("Could not get am with checklist", ex);
return null;
}
}
更新:
由于您(可能)实际上希望知道具有MonitorEnteredEmpID
的元素的计数,您可以考虑使用完全不同的返回类型。如果Dictionary<int, int>
将您的MonitorEnteredEmpID
映射到元素计数:
public Dictionary<int, int> GetAllComplaintsCount()
{
try
{
return _context.Checklists
.GroupBy(a => a.MonitorEnteredEmpID)
.ToDictionary(g => g.Key, g => g.Count);
}
catch (Exception ex)
{
_logger.LogError("Could not get am with checklist", ex);
return null;
}
}
你可以这样写:
Dictionary<int, int> result = GetAllComplaintsCount();
Console.WriteLine("ID COUNT");
foreach(int id in result.Keys)
Console.WriteLine($"{id} {result[id]}");