2016-12-24 11 views
0

私は、別のオブジェクトのコレクションであるプロパティを持つオブジェクトを持っています。私はLINQを使用してコレクションプロパティのサブセットをロードしたいと思います。スキップを使用してLINQを取り込む

は、ここで私はそれをやろうとしている方法は次のとおりです。

manager = db.Managers 
      .Include(m => m.Transactions.Skip((page - 1) * 10).Take(10)) 
      .Where(m => m.Id == id) 
      .FirstOrDefault(); 

上記のコードは、インクルードパス式はタイプに定義されたナビゲーションプロパティを参照する必要があります

を言うエラーがスローされます。参照ナビゲーションプロパティには点線のパスを使用し、コレクションナビゲーションプロパティにはSelect演算子を使用してください。\ r \ nパラメータ名:パス

LINQでこれを行う正しい方法は何ですか?前もって感謝します。

+0

平均して、特定のマネージャーには多くのトランザクションがありますか?言い換えれば、パフォーマンスにどのように関心がありますか?それほど多くない場合、あなたは熱心な読み込みをしてから、SkipとTakeで通常のフィルタ処理をすることができます。 –

+0

@BrunoSaboia応答をありがとう。はい。マネージャーは多くのトランザクションを持つことができます。すべてのトランザクションをロードすると、アプリケーションが遅くなる可能性があります。私はすでに熱心なローディングを使用していると信じていますが、私は "スキップしてフィルタリングして正常に取る"ことについてはあまりよく分かりません。どのように私はそれを正確に行うのですか? – Rian

+0

Rian、あなたは熱心な読み込みを使用していません、あなたは遅延読み込みを使用しています。熱心なローディングは、特定のマネージャーのすべてのトランザクションをロードします。私はマネージャーごとにたくさんのトランザクションを持っているので、熱心な負荷を使いたくないと思うかもしれません。私はあなたのニーズを尊重し、ここに戻ってくる解決策を考えていきます。 –

答えて

0

場合によっては、すべてを1つのクエリに組み込むという複雑さがそれに値するものではありません。これを実行した後、manager.Transactionsはこれらだけにロードされたトランザクションを参照するために同様に使用することができることを

var manager = db.Managers.SingleOrDefault(m => m.Id == id); 
var transactions = db.Transactions 
    .Where(t => t.ManagerId == id) 
    // .OrderBy(...) 
    .Skip((page - 1) * 10).Take(10) 
    .ToList(); 

注:Entity Frameworkのは、自動的に限り、彼らがしているとして、ロードされたエンティティを結ぶ私は2つの別々のクエリにこれを分割う同じコンテキストにロードされます。遅延読み込みが無効になっていることを確認して、EFが特にフィルタリングしようとした他のすべてのトランザクションを自動的に引き込まないようにします。

+0

私は実際このアプローチについて考えましたが、すべてを単一のクエリに入れることが最も効率的な方法であると考えました。まあ、私は間違っていたと思います。このソリューションは私のために働いた!どうもありがとう! – Rian

1

これを含めることはできません。 EFは単にそれをSQLに変換する方法を知らないだけです。しかし、サブクエリと同様のことができます。

manager = db.Managers 
      .Where(m => m.Id == id) 
      .Select(m => new { Manager = m, 
           Transactions = db.Transactions 
               .Where(t=>t.ManagerId == m.Id) 
               .Skip((page-1) * 10) 
               .Take(10)}) 
      .FirstOrDefault(); 

これは、Managerクラスのインスタンスを返しません。しかし、あなたのニーズに合わせて変更するのは簡単です。

  1. すべてのトランザクションをロードし、メモリ内のフィルタ:

    また、あなたは他の二つのオプションがあります。もちろん、多くのトランザクションがある場合、これは非常に非効率的である可能性があります。

  2. データベースで2つのクエリを作成するのを怖がってはいけません。これはおそらく最善のルートであり、おそらく最も効率的な方法です。

いずれにしても、パフォーマンスに懸念がある場合は、3つのアプローチをすべてテストし、最も速いものが何であるかを確認することをお勧めします。そして結果が何だったのか教えてください!

+0

私はあなたの最初の解決策を試しましたが、うまく機能しませんでした。私は他の2つのオプションのうちの2番目のものを使用しています。これは以前hvdによって提案されていて、動作させました。あなたのソリューションをありがとうが、私は正しい答えとして彼の答えを受け入れる必要がありますので、hvdは、まず作業のソリューションを投稿した。とにかくおかげさまです。 – Rian

関連する問題