【问题标题】:Entity Framework OrderBy On Joined Collection实体框架 OrderBy 加入集合
【发布时间】:2012-01-27 11:05:01
【问题描述】:

我正在使用 PredicateBuilder 和 LINQKit 构建一个相当复杂的动态查询。模型结构有点像

MediaGallery (one-to-many) MediaGalleryItems (one-one) MediaItems

我渴望加载整个关系,并且这部分工作正常。

每个 MediaGalleryItem 都有一个“Order”属性,它允许图库中的项目具有特定的顺序。我需要 OrderBy 这个,所以我有点想做:

IQueryable<MediaGallery> query = ...
... lots of stuff ...
query = query.OrderBy(m => m.MediaGalleryItems.Order)

但显然这不会起作用,因为 MediaGalleryItems 是 MediaGalleryItem 对象的集合。我也试过了

query = query.OrderBy(m => m.MediaGalleryItems.OrderBy(mgi => mgi.SortOrder));

编译但不起作用。看起来应该很容易,我是否遗漏了一些明显的东西?

编辑:我应该说我仅限于单个 MediaGallery,所以如果我是手写 SQL,那么做这样的事情来减少 DB 访问可能是有意义的。 Joachim Isaksson 的评论正确地指出,如果您没有先通过 MediaGallery.Id 订购,这可能会导致多个 MediaGallery 陷入混乱。

因此,我想我的问题是;有什么方法可以强制 Linq 在这里输出我需要的 SQL,或者我应该让自己轻松一点,然后再去 DB 一次?

【问题讨论】:

  • 您不能真正按集合订购,如果 MediaGallery1 有 2 件商品的订单为 1 和 4,而 MediaGalley2 有 2 件商品的订单为 2 和 3,MediaGalleries 的预期顺序是多少?
  • 好点,谢谢。但是我应该说我选择了一个 MediaGallery,所以在这种情况下减少数据库旅行似乎是合乎逻辑的。如果不可能,我可以理解为什么要考虑更广泛的情况。
  • query 是什么?这是一个MediaGallery 集合?请张贴样本数据和预期结果。也许您正在寻找firstordefault
  • 如果您尝试在查询中订购子集合,我想不出任何方法,实际上它们通常(默认?)映射到 Set 所以即使在数据库对其进行排序的情况下,它也会无序地存储在内存中。当我需要对子集合进行排序时,我会获取结果并使用内存中的 Linq2Objects 对子集合进行排序。
  • 谢谢。查询返回后在内存中排序似乎是最好的选择。

标签: linq entity-framework entity-framework-4


【解决方案1】:

您必须先在应用程序中订购商品,然后才能将它们展示给用户。急切加载不提供排序导航属性(关系),即使提供,EF 也可能无法确保在实现后保持此顺序,因为它不使用任何有序集合(如果您允许延迟加载,它使用基于哈希集的集合)。

如果你想要有序的关系,你必须使用投影:

var query = from x in context.MediaGallery
            where x ...
            select new 
                {
                    MediaGellery = x,
                    MediaGalleryItems = x.MediaGalleryItems.OrderBy(i => i.Order)
                };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-20
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    相关资源
    最近更新 更多