Linq Where Contains …保持默认顺序

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

var recentCats = (from i in EntityCache.Default.GetAll() 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,我想要返回的对象的顺序不同,而不是缓存返回的顺序。 在entity framework中是否有任何方法可以执行此操作,或以任何方式执行此操作而不涉及我编写foreach循环?

谢谢

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

LINQ的可枚举方法是否维持元素的相对顺序?

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


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

对于任何感兴趣的人,我可以通过加入他们以与列表相同的顺序出现,正如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 ... 

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