2

コードで数回使用する複雑なクエリがあります。これを使用して、すべてのアイテムまたは 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) の場合は、すべての要素に対して実行されます (右?)。

これは仕事をする良い方法ですか?もっときれいな方法はありますか?より効率的な方法は?

4

2 に答える 2