2017-03-15 3 views
0

私はエンティティフレームワークv6クエリをフィルタリングしようとしていますが、あまり成功していません。 私のテーブル(およびエンティティモデル)はここにあります。 - のFileUpload - IEnumerableを化合物 - 文字列の名前エンティティフレームワーク6 - ネストされたコレクションをロードしてフィルタリングすることを熱望します

  • 化合物

    • IEnumerableを結果
    • int型CompoundType
  • 結果

    • int型resultTypeと

私はそれぞれのwhere句で、すべての3つのコレクション(ファイル、化合物、結果)を返すクエリを実行しようとしています。 結果を熱心に読み込み、NoTrackingを含める(これはWebサービスのためです)。

これはSQLで内部結合を使用すると簡単に実現しますが、何らかの理由でEFで同じ結果を達成できません。

だから、例えば私が のリストを取得する必要があります - 結果は、私として評価10の

任意の提案に等しい - 化合物はまた、3 に等しい - FileUpload.Nameは=「XYZ」 ファイルのアップロード最後の数日間はこれを理解しようとしていました。

答えて

0

免責事項:私はEntity Framework Plus

EF +クエリIncludeFilter機能は、関連するエンティティをフィルタリングできるように、プロジェクトの所有者です。

var files = context.Files 
    .Where(x => !x.IsDeleted) 
    .IncludeFilter(x => x.Compound.Where(y => !y.IsDeleted))) 
    .IncludeFilter(x => x.Compound.Select(y => y.Result.Where(z => !z.IsDeleted))) 
    .ToList(); 

注:私はこれがEF6では不可能であると仮定し

EF+ Query IncludeFilter

ANSWERサブ質問:すべてのパスが

ウィキに含まれている必要がありますか?

この機能は、EF5 & EF6でサポートされています。

SELECT N+1の問題のため、EFコアはまだサポートされていません。

0

あなたがAsNoTrackingを使用していないのであれば、別のアプローチがあります。

代わりに、必要な正確なデータでサブタブを最初にロードすることができます。最後に、トップテーブルをロードするだけです。DbContextはリレーションシップを自動マップし、その時点でメモリにロードされたサブデータのみを含めます。

擬似コード:

var ctx = new MyContext(); 
ctx.Compounds.Where(a => ...).ToList(); // Now in ctx memory 
ctx.Results.Where(a => ...).ToList() // Now in ctx memory 
return ctx.FileUploads.Where(a => ...).ToList(); // Will auto hook up any relationships loaded in memory 
関連する問題