EFコアを使用して1つのクエリを実行したい場合、子エンティティでフィルタリングしてページングを適用する必要があります。以下の私の(サンプル)データモデルを参照してください: 私はすべてのデータ(顧客、注文の注文の詳細と製品)を取得したいと思います。私は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の顧客を取得しません。
誰かが私が望む結果を得るためのより良いクエリを持っていますか?
ありがとうムハンマド。 Distinctは完全な行に適用されるため、Customer、Orderなどが必要です。必要な結果を得るためにCustomerをDistinctにする必要がありますが、そうではありません。 – dennieku