2

我有兩個實體稱爲類別和產品與1:n的關係。EF代碼第一次急切加載和OrderBy問題

我想要得到一個類別與它的孩子,孩子是爲了。

這是我的LINQ:

_db.Categories.Where(c => c.CategoryID == catID) 
    .Include(c => c.Products.OrderBy(p => p.ProductID)) 
    .SingleOrDefault(); 

該查詢執行與以下異常,因爲排序依據的。

包含路徑表達式必須將 指向 類型上定義的導航屬性。使用 參考導航屬性的虛線路徑和 導航屬性的選擇運算符的 。參數名: 路徑

回答

1

Include必須引用一個導航屬性,這意味着你可以不包括OrderBy()。取而代之的是:

_db.Categories 
    .Where(c => c.CategoryID == catID) 
    .Include(c => c.Products.OrderBy(p => p.ProductID)) 
    .SingleOrDefault(); 

...你將不得不使用這樣的:

_db.Categories 
    .Where(c => c.CategoryID == catID) 
    .Include(c => c.Products) 
    .SingleOrDefault(); 

...訪問的Products有序列表中爲每個Category,你可以將屬性添加到Category像這樣:

class Category 
{ 
    public IEnumerable<Product> OrderedProducts 
    { 
     get { return this.Products.OrderBy(p => p.ProductID); } 
    } 
} 
5

不能訂購或過濾急切加載的數據。這是LINQ到實體的限制,以及如何通過使用投影命令在數據庫中關係的唯一途徑:

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

您可以投影到匿名或自定義的類型,但你不能投射到映射的類型(例如Poll )。

另一種方式是劃分這兩個查詢和使用明確的加載:

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