我在我的ASP.NET核心应用以下模型:
public class LocationTypeGroup {
public string Name { get; set; }
public IEnumerable<LocationType> LocationTypes { get; set; }
}
public class LocationType
{
[Key]
public int LocationTypeID { get; set; }
public string Name { get; set; }
public string IntExt { get; set; }
}
我想运行一个查询,通过INTEXT它们分组和排序由每个组内的名称。
下面的工作,但不排序:
public async Task<List<LocationTypeGroup>> GetGroupedLocationTypes()
{
return await _context.LocationTypes
.GroupBy(p => p.IntExt)
.Select(g => new LocationTypeGroup
{
Name = g.Key,
LocationTypes = g.Select(x => x)
})
.OrderBy(x=>x.Name)
.ToListAsync();
}
如果我改成这样:
LocationTypes = g.Select(x => x).OrderBy(x => x)
然后,我还没有得到一个排序结果。
我究竟做错了什么?
这有可能是EF不能建立SQL查询。
所以,你需要手动简化它。和分流至2次的查询:
var groups = await context.LocationTypes
.GroupBy(p => p.IntExt)
.ToListAsync();
return groups.Select(g => new LocationTypeGroup
{
Name = g.Key,
LocationTypes = g.Select(x => x)
})
.OrderBy(x=>x.Name);
第一个查询荷载作用下简组,第二它们排序,并转换为LocationTypeGroup
。
可能是它造成太旧版本的实体框架核心。试试这个办法,而且这将是更便宜:
//data is loaded into memory
var data = await _context.LocationTypes.ToListAsync();
//data's transform
var answer = data.GroupBy(x => x.IntExt)
.Select(x => new LocationTypeGroup
{
Name = x.Key,
LocationTypes = x.AsEnumerable()
}).OrderBy(x => x.Name).ToList();