2017-04-04 14 views
4

LINQクエリに含まれる項目にフィルタ条件を追加するのが難しいです。私のクエリは次のようなものですEntity Frameworkにフィルタの子コレクションが含まれています

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クラス

私はLINQとEF

+0

をテストされていないあなたはフィルタリングするために、正確に何をしようとしている - あなたはorder.inner.isdeletedどこorder.innerからのエントリのみを含めるか、またはあなたが全体のレコードを削除したいです例えば、条件を満たす注文の行全体? 2番目の場合、order.innerに2つのエントリがある場合、isDeleted = trueとisDeleted-falseの2つのエントリがある場合はどうなりますか? – Alex

+0

@Alex: 'フィルタ条件が内部のアイテムのみが必要です。 isDeleted = true。 '、つまり、削除された内部レコード(inner.isDeleted = true)のみを含める必要があります。これは内部レコードのみであり、外部レコードには影響しません。 –

+0

ネストされたリストをフィルタリングしようとしているようです。私はこの質問はあなたに役立つかもしれないと思うhttp://stackoverflow.com/questions/25183685/how-to-filter-nested-list-using-linq-lambdaこれとhttp://stackoverflow.com/questions/7079378/how -to-filter-nested-collection-entity-framework-objects – Alex

答えて

3
で新しいですので、誰も私にこれを行うには良いアプローチを提案することができます

免責事項:私はプロジェクトのオーナーです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(); 

注:mixteが& & IncludeFilterを含めることはできません。

ウィキ:EF+ Query IncludeFilter

EDIT:サブ質問

回答しかし、我々は唯一の

はい、ボンネットの下に、自分のライブラリーは、同様のを使用して、この使用して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(); 

注:コードは

+0

EF +リファレンスを追加する必要はありますか? –

+0

はい、IncludeFilter機能を使用できるようにするには、このライブラリを参照で追加し、 "Z.EntityFramework.Plus"名前空間を使用する必要があります。 –

+0

しかし、私たちはEFだけを使ってこれを達成することができます。私の答え –

関連する問題