Linq 加入集合上的实体框架OrderBy

Linq 加入集合上的实体框架OrderBy,linq,entity-framework,entity-framework-4,Linq,Entity Framework,Entity Framework 4,我正在使用PredicateBuilder和LINQKit构建一个相当复杂的动态查询。模型结构看起来有点像 MediaGallery (one-to-many) MediaGalleryItems (one-one) MediaItems 我急切地想把这段感情全部装进去,这一部分工作得很好 每个MediaGalleryItem都有一个“Order”属性,允许库中的项目具有特定的顺序。我需要订购这个,所以我想做: IQueryable<MediaGallery> query = ..

我正在使用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)
它可以编译但不起作用。看起来应该很容易,我是不是遗漏了一些明显的东西

编辑:我应该说我只限于一个MediaGallery,所以如果我是手工编写SQL,那么做类似这样的事情来减少数据库跳闸可能是有意义的。Joachim Isaksson的评论正确地指出,如果您不先按MediaGallery.Id订购,这可能会导致多个MediaGallery陷入混乱


因此,我想我的问题是;有没有办法强迫Linq输出我在这里需要的SQL,或者我应该让自己轻松一点,然后第二次访问DB

在向用户显示项目之前,必须在应用程序中对项目进行排序。即时加载不提供排序导航属性(关系),即使它提供了,EF也可能无法确保在物化后保持此顺序,因为它不使用任何排序集合(如果允许延迟加载,则使用基于哈希集的集合)

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

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

如果MediaGallery1有两个订单为1和4的项目,而MediaGallery2有两个订单为2和3的项目,那么您不能真正按集合订购,那么MediaGallery的预期订单是多少?很好,谢谢。然而,我应该说,我选择了一个MediaGallery,所以在这种情况下,为了减少DB跳闸似乎是合乎逻辑的。如果不可能,我可以理解为什么要考虑更广泛的问题。什么是
query
?这是一个
MediaGallery
收藏?请发布样本数据和预期结果。也许您正在寻找
firstordefault
?如果您试图在查询中对子集合排序,我想不出任何方法,事实上它们通常(默认?)映射到一个集合,因此即使在数据库对其排序的情况下,它也会无序地存储在内存中。当我需要对子集合进行排序时,我会使用内存中的Linq2Objects获取结果并对其排序。谢谢。在查询返回后在内存中排序似乎是最好的选择。
var query = from x in context.MediaGallery
            where x ...
            select new 
                {
                    MediaGellery = x,
                    MediaGalleryItems = x.MediaGalleryItems.OrderBy(i => i.Order)
                };