【问题标题】:Linq Where Contains ... Keep default orderLinq Where Contains ... 保持默认顺序
【发布时间】:2012-01-29 23:55:31
【问题描述】:

我有一个 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 ... contains
  • 我认为这里的问题是,SQL 没有顺序,除非您明确订购。 SQL 可以按任意顺序返回,所以没有默认顺序要保留。

标签: c# linq entity-framework


【解决方案1】:

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

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 ...

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

【讨论】:

    【解决方案2】:

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

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

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


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

    【讨论】:

    • 这是 LINQ to Objects。他正在使用 EF,它将从 SQL Server 返回订单。
    • @SLaks 谢谢你提供的信息,我已经用一个可能的解决方案编辑了我的答案。
    • 感谢您的解释和链接。不过,这并不是我想要的,因为我认为我的问题不够具体。目前,我的结果按照它们在缓存中的顺序返回,因为这是我正在运行的查询 - 我希望它们按照我正在检查的列表的顺序排列。我可以通过使用上面 Ray 提到的连接而不是包含子句来做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2010-09-17
    • 2017-05-25
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多