【问题标题】:EF Core retrieve rows grouped by a value from a columnEF Core 检索按列中的值分组的行
【发布时间】:2020-04-13 13:33:50
【问题描述】:

我们以这样的表格为例(数据必须在一个表格中):

我想得到这样的结果 JSON:

[
    {
        "manufacturer" : "VW",
        "cars" : [
            {
                "id" : 1,
                "model" : "Golf"
            },
            {
                "id" : 3,
                "model" : "Passat"
            },
            {
                "id" : 6,
                "model" : "Polo"
            }
        ]
    },
    {
        "manufacturer" : "Renault",
        "cars" : [
            {
                "id" : 2,
                "model" : "Laguna"
            },
            {
                "id" : 5,
                "model" : "Clio"
            }
        ]
    },
    {
        "manufacturer" : "Ford",
        "cars" : [
            {
                "id" : 4,
                "model" : "Fiesta"
            }
    }
]

问题是,当我尝试在不同的列表中获取制造商,然后使用 foreach 循环获取数据时,我收到有关数据读取器已打开的错误。

var manufacturers = _context.Cars.Select(s=> s.Manufacturer).Distinct();

foreach(var m in manufacturers)
{
   var sublist = _context.Cars.Where(q=> String.Equals(q.Manufacturer, m).ToList();
   // Add sublist to the specified models field (list)
}

我有一个模型,其中包含制造商字段和汽车列表。

【问题讨论】:

    标签: c# linq lambda ef-core-3.0


    【解决方案1】:

    首先,从数据库中获取汽车:

                   var carsList = context.Cars.ToList();
    

    这样,您正在对数据库执行查询,您将获得内存中的所有汽车对象列表,因此您可以使用此列表执行复杂的查询操作。

    在你的情况下:

                var list = carsList.GroupBy(x => x.Manufacturer).Select(x => new
                {
                    manufacturer = x.Key,
                    cars = x.Select(y=> new 
                    {
                        id = y.Id,
                        model = y.Model
                    })
                }).ToList();
    

    但如果您尝试直接在数据库中进行此查询,

    var list = context.Cars.GroupBy(x => x.Manufacturer).Select(x => new...
    

    如果您使用的是 EF Core 3.0 及更高版本,您将遇到客户端与服务器评估运行时异常,默认情况下在 Ef Core 3.0 中激活。

    更多详细信息,请点击此处:

    https://docs.microsoft.com/en-us/ef/core/querying/client-eval

    【讨论】:

    • 谢谢,这是我正在寻找的方法。但是,在从数据库中获取初始列表后,我不得不添加另一个 Select。在我的真实案例中,我按另一个表中的字段分组,因此我使用导航属性,然后在 GroupBy 子句中获得空引用。如果我首先投影字段,那么一切正常。你知道为什么会这样吗?至于例外,我没有得到任何东西,一切都适用于 EF Core 3.1.1
    【解决方案2】:

    你可以试试下面的,

    var result = _context.Cars.GroupBy(x => x.Manufacturer).Select(x => new { manufacturer = x.Key, cars = x.Select(y => new { id = y.Id, model = y.Model }).ToList() }).ToList();
    var json = JsonConvert.SerializeObject(result);
    

    PS:您可以在只读场景中使用 AsNoTracking() 以获得更好的性能,例如

    _context.Cars.AsNoTracking()...
    

    更多详情,请访问here

    【讨论】:

      【解决方案3】:

      你可以试试:

      manufacturers.Group(m=>m.manufacturer)
      

      你可以得到一个新的数据结构,它包含key(manufacturer)value(List<cars>)

      【讨论】:

        猜你喜欢
        • 2020-12-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-22
        • 2022-02-27
        • 1970-01-01
        • 1970-01-01
        • 2013-07-01
        • 2020-11-16
        相关资源
        最近更新 更多