我正在使用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,或者我应该让自己轻松一下并再次访问数据库?
答案 0 :(得分:0)
在向用户展示之前,您必须在应用程序中订购商品。急切加载不提供排序导航属性(关系),即使它确实EF可能无法确保在实现后维护此顺序,因为它不使用任何有序集合(如果允许延迟加载它使用基于散列集的集合)。
如果您想要有序关系,则必须使用投影:
var query = from x in context.MediaGallery
where x ...
select new
{
MediaGellery = x,
MediaGalleryItems = x.MediaGalleryItems.OrderBy(i => i.Order)
};