我想通过传入一个 ID 列表来补充实体集合并保留顺序。
另一个 SO 答案https://stackoverflow.com/a/15187081/1059911建议使用这种方法来为实体补水,效果很好
var entities = db.MyEntities.Where(e => myListOfIds.Contains(e.ID)).ToList();
但是集合中实体的顺序与 ID 的顺序不同
有没有办法保留订单?
我想通过传入一个 ID 列表来补充实体集合并保留顺序。
另一个 SO 答案https://stackoverflow.com/a/15187081/1059911建议使用这种方法来为实体补水,效果很好
var entities = db.MyEntities.Where(e => myListOfIds.Contains(e.ID)).ToList();
但是集合中实体的顺序与 ID 的顺序不同
有没有办法保留订单?
可能会有所帮助:
var entities = db.MyEntities
.Where(e => myListOfIds.Contains(e.ID))
.OrderBy(e => myListOfIds.IndexOf(e.ID)).ToList();
编辑
JohnnyHK澄清说这不适用于 LINQ to Entities。为此,您需要订购IEnumerable而不是IQueryable,因为IQueryProvider在向服务器发送查询时不知道如何处理本地列表IndexOf方法。但是在AsEnumerable() OrderBy方法处理本地数据之后。所以你可以这样做:
var entities = db.MyEntities
.Where(e => myListOfIds.Contains(e.ID))
.AsEnumerable()
.OrderBy(e => myListOfIds.IndexOf(e.ID)).ToList();
实体框架包含所有 LINQ 命令的子集,因此您不会拥有 LINQ to Objects 拥有的所有命令。
以下方法应该以与 myListOfIds 提供的相同顺序为您提供 MyEntities 列表:
var entities = myListOfIds.Join(db.MyEntities, m => m, e => e.ID, (m,e) => e)
.ToList();