实体框架OrderBy On Joined Collection

时间:2012-01-27 11:05:02

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

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

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

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

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

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,那么做这样的事情可能会减少数据库的数量。 Joachim Isaksson的评论正确地指出,如果您没有首先通过MediaGallery.Id订购,这可能会导致多个MediaGallery的混乱。

我想我的问题是;是否有任何方法可以强制Linq输出我需要的SQL,或者我应该让自己轻松一下并再次访问数据库?

1 个答案:

答案 0 :(得分:0)

在向用户展示之前,您必须在应用程序中订购商品。急切加载不提供排序导航属性(关系),即使它确实EF可能无法确保在实现后维护此顺序,因为它不使用任何有序集合(如果允许延迟加载它使用基于散列集的集合)。

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

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