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返回所有清单的计数?

Linq to SQL Group by Controller

方法GetAllComplaintsCount()的返回类型是IQueryable<CHECKLIST>。但是在你的查询中,你在

创建了一个匿名类型
.Select(a => new { Amount = a.Sum(b =>b.MonitorEnteredEmpID), Name = a.Key })

,你尝试返回这个匿名类型的List<T>。因此,不能将其转换为IQueryable<CHECKLIST>

所以我猜你有一个叫做CHECKLIST的类(或结构),它的属性叫做AmountName(当你在查询中使用它们时)。现在,不是创建匿名类型的实例,而是创建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]}");