2017-10-02 18 views
3

EFコアを使用して1つのクエリを実行したい場合、子エンティティでフィルタリングしてページングを適用する必要があります。以下の私の(サンプル)データモデルを参照してください: Data Model 私はすべてのデータ(顧客、注文の注文の詳細と製品)を取得したいと思います。私はOrder.OrderStateにフィルタを適用する必要があると私はしたい第一10のレコード(顧客)EFコアフィルタリング+子エンティティを使用したページング

これは私が試したLINQクエリです:

var customers = await _ctx.Customer 
      .Include(c => c.Order.Where(o => o.OrderState == 0)) 
      .ThenInclude(o => o.OrderDetail) 
      .ThenInclude(d => d.Product) 
      .Skip(0).Take(10) 
      .ToListAsync(); 

私は次のエラーを取得するこのクエリを実行する場合: InvalidOperationException:([o] .OrderState == 0)select [o]} 'が有効ではないc.OrderのOrder oのプロパティ式' c => {式はプロパティへのアクセスを表す必要があります: 't => t.MyProperty'。関連データに

を含むの詳細についてはだから私は、別のクエリを試してみました:

var qry = from c in _ctx.Customer 
        join o in _ctx.Order on c.Id equals o.CustomerId 
        join d in _ctx.OrderDetail on o.Id equals d.OrderId 
        join p in _ctx.Product on d.ProductId equals p.Id 
        where o.OrderState == 0 
        select new { Customer = c, Order = o, OrderDetail = d, Product = p }; 
     var customers = await qry.Skip(0).Take(10).ToListAsync(); 

は今、クエリがエラーを生成しませんが、結果は私が欲しいものではありません。 1-nの関係のため、このクエリは結果に複数回顧客を返します。したがって、最初の10の顧客を取得しません。

誰かが私が望む結果を得るためのより良いクエリを持っていますか?

答えて

0

私はクエリを構築中に ".Distinct()"を使うことができると思います。これが問題を解決することを願っています。

var qry = (from c in _ctx.Customer 
         join o in _ctx.Order on c.Id equals o.CustomerId 
         join d in _ctx.OrderDetail on o.Id equals d.OrderId 
         join p in _ctx.Product on d.ProductId equals p.Id 
         where o.OrderState == 0 
        select new { Customer = c, Order = o, OrderDetail = d, 
         Product = p }).Distinct(); 

var customers = await qry.Skip(0).Take(10).ToListAsync(); 
+0

ありがとうムハンマド。 Distinctは完全な行に適用されるため、Customer、Orderなどが必要です。必要な結果を得るためにCustomerをDistinctにする必要がありますが、そうではありません。 – dennieku

関連する問題