【发布时间】: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