2

EF では、クエリの結果にナビゲーション プロパティを含める場合は、Include(). 一部のクエリでは、これを複数回呼び出す必要があるため、この概念の一般的なラッパーを作成しようとしました。

public IQueryable<T> FindAll<P>(params Expression<Func<T, P>>[] predicates) where P : class {
  var entities = AllEntities();
  foreach (var p in predicates) entities = entities.Include(p);
  return entities;
}

そしてそれを次のように呼び出します:

var customers = FindAll(q => q.Orders, q => q.Invoices, q => q.Contacts);

質問:

  1. 関数はコンパイルされますが、呼び出すと、「メソッドの型引数は使用法から推測できません。型引数を明示的に指定してみてください。」私は何を間違っていますか?
  2. 私がそれを機能させたらInclude()、最初に呼び出すことができます:var customers = FindAll(q => q.Orders, q => q.Invoices);そして、後で別のステップでもう一度呼び出します:customers = customers.Include(p => p.Invoices);または、一度にインクルードを実行する必要があるようなパフォーマンスの低下につながりますか?

編集:
もちろん、JonSkeetの答えは正しいですが、それでも私が望むことをしているように見えるこの解決策があります。ただし、なぜ機能するのかはわかりません。機能のせいAggregate()

4

1 に答える 1

4

基本的に、あなたは問題を抱えていると思います-と仮定してq.Orders、さまざまなタイプq.Invoicesq.Contacts返すと、あなたが何をしたいのかを表現することはできません。あなたはおそらく次のようなものが欲しいでしょう:

entities.Include<Parent, Order>(p => p.Order);
entities.Include<Parent, Invoice>(p => p.Invoices);
entities.Include<Parent, Contact>(p => p.Contacts);

...したがって、P述語ごとに異なる値が必要です。ただし、単一のメソッドを呼び出して、の単一の型引数を提供していPます。

とにかく、これが本当にあなたに多くの利益を与えているかどうかは明らかではありません...あなたはただ書くことができませんでした:

var customers = AllEntities().Include(q => q.Orders)
                             .Include(q => q.Invoices)
                             .Include(q => q.Contacts);

それはより明確で、「複数のタイプのパラメーター」の問題を回避できると思います。

于 2012-10-24T11:49:57.703 に答える