使用时保留返回实体的顺序.Contains(Id)

时间:2013-04-03 22:38:50

标签: linq entity-framework ef-code-first code-first

我希望通过传入ID列表来保存实体集合,并保留订单。

另一个SO答案https://stackoverflow.com/a/15187081/1059911建议采用这种方法来保护效果很好的实体

var entities = db.MyEntities.Where(e => myListOfIds.Contains(e.ID)).ToList();

然而,集合中实体的顺序与Ids的顺序不同

有没有办法保存订单?

2 个答案:

答案 0 :(得分:2)

可能有帮助:

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();

答案 1 :(得分:1)

实体框架包含所有LINQ命令的子集,因此您不会拥有LINQ to Objects所具有的所有命令。

以下方法应按照myListOfIds提供的顺序为您提供MyEntities列表:

var entities = myListOfIds.Join(db.MyEntities, m => m, e => e.ID, (m,e) => e)
               .ToList();