コードで数回使用する複雑なクエリがあります。これを使用して、すべてのアイテムまたは 1 つのアイテムのみを取得します。
from item in _db.Tests ... select getItem(item)
from item in _db.Tests ... where item.Id == id select getItem(item)
共通部分は繰り返さず、実際に使用する場合にのみ「getItem」を呼び出したいと思います。
私はそのような関数を作成しようとしました:
from item in _db.Tests ...
しかし、私は選択していないため、コンパイラは文句を言います。
を作成することもできます:
private IQueryable<Test> getTests()
{
return from item in _db.Tests ... select item;
}
そして、次のように呼び出します。
from t in getTests() select getItem(t)
しかし、それはおそらくLINQが可能な最適化を利用しないでしょう...そうですか?
それを手伝ってもらえますか?
編集
私の問題はもっと複雑であることに気付きました: ドット (...) は実際には結合であり、getItem 関数は結合からの情報を使用していくつかの計算を行います。
また、すべての項目を取得する関数と、特定の項目を取得する別の関数が必要です (プログラムの残りの部分からクエリ ロジックを隠したい)。
私はこれを行うことを考えていました:
private IQueryable<Tuple<Table1, Table2, Table3, Table4>> queryItems()
{
return from t1 in _db.Table1s
join t2 in _db.Table2s on t1.T2ID equals t2.ID into outerT2 from t2 in outerT2.DefaultIfEmpty()
join t3 in _db.Table3s on t1.T3ID equals t3.ID into outerT3 from t3 in outerT3.DefaultIfEmpty()
join t4 in _db.Table4s on t1.T4ID equals t4.ID into outerT4 from t4 in outerT4.DefaultIfEmpty()
select new Tuple<Table1, Table2, Table3, Table4>(t1, t2, t3, t4);
}
public IEnumerable<Item> GetItems()
{
return from i in queryItems()
select getItem(i.Item1, i.Item2, i.Item3, i.Item4);
}
public Item GetItem(int id)
{
return from i in queryItems()
where i.Item1.ID equals id
select getItem(i.Item1, i.Item2, i.Item3, i.Item4);
}
getItem は何らかの計算を行うため、queryItems に入れたくありません。GetItem(int id) の場合は、すべての要素に対して実行されます (右?)。
これは仕事をする良い方法ですか?もっときれいな方法はありますか?より効率的な方法は?