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
例如,让我们这样 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