2

は、私は2つの1とカテゴリーと製品と呼ばれるエンティティを持っています。EFコード最初イーガーロードと[並べ替えの問題

私は順序であるチャイルズそのチャイルズとカテゴリーを取得したいです。

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

このクエリが原因でORDERBYの以下の例外を除いて強制:

は、これは私のLINQです。

インクルードパス式は タイプに定義されたナビゲーションプロパティに を参照する必要があります。 参照ナビゲーションプロパティとコレクション ナビゲーションプロパティの 選択オペレータのための点線のパスを使用してください。パラメータ名: パス

答えて

1

IncludeあなたがOrderBy()を含めることができないことを意味ナビゲーションプロパティを参照する必要があります。この代わりに:あなたはCategoryにプロパティを追加することができ、各CategoryためProductsの順序付けられたリストにアクセスするには...

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

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

...あなたはこれを使用する必要がありますこのように:

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 )。

もう一つの方法は、2つのクエリにこれを分割し、明示的なロード使用されています

var poll = _db.Polls.SingleOrDefault(c => c.CategoryID == pollID); 
_db.Entry(poll).Collection(c => c.Products) 
       .Query() 
       .OrderBy(p =>.ProductID) 
       .Load(); 
関連する問題