EF Code首先是Eager loading和OrderBy问题

Gho*_*ngi 2 linq linq-to-entities entity-framework eager-loading ef-code-first

我有两个名为Category和Product的实体,其中1:n关系.

我希望得到一个带有孩子的分类.

这是我的linq:

 _db.Categories.Where(c => c.CategoryID == catID)
    .Include(c => c.Products.OrderBy(p => p.ProductID))
    .SingleOrDefault();
Run Code Online (Sandbox Code Playgroud)

由于orderby,此查询使用以下异常强制执行.

Include路径表达式必须引用在类型上定义的导航属性.使用虚线路径作为参考导航属性,使用Select运算符作为集合导航属性.参数名称:路径

Lad*_*nka 5

无法订购或过滤预先加载的数据.这是linq到实体的限制,如何在数据库中订购关系的唯一方法是使用投影:

var data =  _db.Polls
               .Where(c => c.CategoryID == pollID)
               .Select(c => new 
                   {
                       Pool = c,
                       Products = c.Products.OrderBy(p => p.ProductID)
                   })
               .SingelOrDefault();
Run Code Online (Sandbox Code Playgroud)

您可以投影到匿名或自定义类型,但不能投影到映射类型(例如Poll).

另一种方法是将其分为两个查询并使用显式加载:

var poll = _db.Polls.SingleOrDefault(c => c.CategoryID == pollID);
_db.Entry(poll).Collection(c => c.Products)
               .Query()
               .OrderBy(p =>.ProductID)
               .Load();
Run Code Online (Sandbox Code Playgroud)