web-dev-qa-db-ja.com

Entity Frameworkにはフィルターの子コレクションが含まれます

LINQクエリに含まれるアイテムのフィルター条件を追加するのが難しいです。私のクエリは

var item = _Context.Order.Include("Inner")
           .Include("Inner.first")
           .Include("Inner.second")
           .Where(x => ( !(x.IsDeleted) && (x.IsActive) && 
                 (x.itemid == id))).FirstOrDefault();

上記のコードでは、「Inner」はアイテムの別のリストです。次に、内側のアイテムをフィルタリングする必要があります。フィルター条件inner.isDeleted = trueの内部アイテムのみが必要です。

クエリは次のようなクラスを返す必要があります

public class Order
{

    public string Name { get; set; }
    public List<InnerDetails> Inner{ get; set; }
    public bool IsDeleted { get; set; }
}

とInnerDetailsクラスのような

public class InnerDetails 
{

    public string Sample { get; set; }
    public bool IsDeleted { get; set; }
    public int firstId { get; set; }
    public int secondID { get; set; }
    public First first{ get; set; }
    public Second second{ get; set; }
}

私はLINQとEFに新しいので、誰かが私にこれを行うためのより良いアプローチを提案できますか

10
Isha John

免責事項:私はプロジェクトの所有者です Entity Framework Plus

EF +クエリのIncludeFilter機能により、関連エンティティをフィルタリングできます。

var item = _Context.Order
           .IncludeFilter(x => x.Inner.Where(y => y.IsDeleted))
           .IncludeFilter(x => x.Inner.Where(y => y.IsDeleted).Select(y => y.first))
           .IncludeFilter(x => x.Inner.Where(y => y.IsDeleted).Select(y => y.second))
           .Where(x => ( !(x.IsDeleted) && (x.IsActive) && 
                 (x.itemid == id))).FirstOrDefault();

注:IncludeとIncludeFilterを混在させることはできません。

Wiki: EF + Query IncludeFilter

編集:サブ質問に回答します

しかし、EFのみを使用してこれを達成できます

はい、内部では、私のライブラリはプロジェクションと同様のソリューションを使用しています

var item = _Context.Order.Select(x => new {
                Order = x,
                Inner = x.Inner.Where(y => y.IsDeleted),
                first = x.Inner.Where(y => y.IsDeleted).Select(y => y.first)
                second = x.Inner.Where(y => y.IsDeleted).Select(y => y.second)
            })
            .Where(x => ( !(x.IsDeleted) && (x.IsActive) && (x.itemid == id)))
            .FirstOrDefault()
            .Select(x => x.Order)
            .FirstOrDefault();

注:コードはテストされていません

EDIT:回答のコメント

EF Coreでこの問題に遭遇しました。 EF + CoreバージョンにもIncludeFilterを実装しますか?

V1.10.0以降、IncludeFilterがEF Core 2.xでサポートされるようになりました

参照: リリースノート

8
Jonathan Magnan

EF Coreでこれを達成することができました。同じ概念がEF6にも当てはまると確信しています。

あなたの例を単純化する:

var item = ctx.Order.Include("Inner")
              .Where(x => x.Inner.Any(innerItem => innerItem.IsDeleted))
              .FirstOrDefault();
1
JsonStatham

EF Core自体でこれを実現できます。

var item = 
ctx.Order.Include("Inner")
         .Select(x => x.Inner
                .Where(innerItem => innerItem.IsDeleted))
         .FirstOrDefault();

または、

var item = 
    ctx.Order.Include(o=> o.Inner
                     .Where(x => x.IsDeleted));
0
Amruthann K S