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

6

我有一组ID号码,想要返回一些对象。我使用了一个Linq语句,并在其中使用了一个where子句,该子句使用了一个contains语句:

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循环的方法来实现这一点?感谢您的帮助。

很抱歉我没有时间给你一个完整的答案,但我可以给你一个提示。它涉及将您的ID列表连接到类别列表上,而不是使用“where ...包含”。 - Ray
我认为这里的问题是,除非你明确排序,否则 SQL 没有顺序。SQL 可以以任何顺序返回,因此没有默认顺序可保留。 - Euphoric
2个回答

3

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

LINQ的Enumerable方法是否保持元素的相对顺序?

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


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

1
这是LINQ查询对象。他正在使用EF,它会从SQL Server返回订单。 - SLaks
@SLaks谢谢您提供的信息,我已经编辑了我的答案并提供了可能的解决方案。 - Gent
感谢您的解释和链接。不过,这并不是我正在寻找的,因为我认为我在问题上没有表达得够清楚。目前,我的结果按照缓存中的顺序返回,因为这是我运行的查询 - 我希望它们按照我检查的列表顺序返回。我可以通过使用Ray上面提到的连接而不是包含子句来实现这一点。 - Mathew Collins

2

如果有人感兴趣,我能够通过连接它们来使它们按照列表中的相同顺序出现,正如以上评论中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 ...

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接