我的ASP.NET Core应用程序中具有以下模型:
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)
然后我仍然没有得到排序的结果。
我在做什么错了?
答案 0 :(得分:1)
可能是由于Entity Framework Core版本太旧造成的。尝试这种方法,而且会更便宜:
//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();
答案 1 :(得分:1)
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
。