EF Core 从列中检索按值分组的行

EF Core retrieve rows grouped by a value from a column

例如,让我们这样 table(数据必须在一个 table 中):

我想得到这样的结果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 循环获取数据时,我收到关于数据 Reader 已经打开的错误。

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

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

你可以试试:

manufacturers.Group(m=>m.manufacturer)

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

您可以尝试以下方法,

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

首先,使用以下命令从数据库中获取汽车:

               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