Linq Where Contains ...保持默认顺序

时间:2011-12-29 15:51:54

标签: c# linq entity-framework

我有一个ID号的集合,我希望返回一些对象,我是通过使用linq语句来实现的,其中使用了包含语句的地方:

var recentCats = (from i in EntityCache.Default.GetAll<Categories>()
                          where WebProfile.Current.RecentlyCreatedCategories.Contains(i.Id)
                          && BoundCategory.ParentItemClass.Id.Equals(i.ParentItemClass.Id)
                          select new CategoryInfo()
                          {
                              Category = i,
                              ClassId = i.ParentItemClass.Id,
                              ClassImage = NamedResourceManager.GetResourceBinary(i.ParentItemClass.NameResourceId)
                          });

这完全正常,除了我想保持返回集合中的项目顺序与它们在列表中的顺序相同。例如,如果我有一个ID列表:14,603,388 ,我希望返回的对象具有相同的顺序,而不是缓存返回的顺序。实体框架中是否有任何方法可以执行此操作,或以任何方式执行此操作而不涉及我编写foreach循环?

由于

2 个答案:

答案 0 :(得分:3)

与大多数扩展程序一样,Where Linq扩展名保留了列表的原始顺序。

Do LINQ's Enumerable Methods Maintain Relative Order of Elements?

只要您没有明确地重新排序或使用自然会重新排序原始列表的运算符,就应该维护该顺序。显然,重新排序where语句的列表将不需要开销。


上述信息不适用于此问题的原因在下面的评论中。 我建议将select的输出更改为键/值对,其中键是列表中Id的索引,值是您的新对象,然后orderBy结果集上的键,并选择值。

答案 1 :(得分:1)

对于任何感兴趣的人,我可以通过加入他们来使他们以与列表相同的顺序出现,正如Ray在上面的评论中提到的那样。

var recentCats = (from i in WebProfile.Current.RecentlyCreatedCategories
                              join b in allCats
                                on i equals b.Id
                              where BoundCategory.ParentItemClass.Id.Equals(b.ParentItemClass.Id)
                              select ...

再次感谢您的帮助和帮助。答案。