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に新しいので、誰かが私にこれを行うためのより良いアプローチを提案できますか
免責事項:私はプロジェクトの所有者です 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でサポートされるようになりました
参照: リリースノート
EF Coreでこれを達成することができました。同じ概念がEF6にも当てはまると確信しています。
あなたの例を単純化する:
var item = ctx.Order.Include("Inner")
.Where(x => x.Inner.Any(innerItem => innerItem.IsDeleted))
.FirstOrDefault();
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));