4

Enumerable.ToDictionaryを使用して、linq呼び出しから辞書を作成しています。

return (from term in dataContext.Terms
        where term.Name.StartsWith(text)
        select term).ToDictionary(t => t.TermID, t => t.Name);

その呼び出しは各用語全体をフェッチしますか、それともデータプロバイダーからTermIDフィールドとNameフィールドのみを取得しますか?言い換えれば、代わりに次のように記述した場合、データベーストラフィックを節約できますか?

return (from term in dataContext.Terms
        where term.Name.StartsWith(text)
        select new { term.TermID, term.Name }).ToDictionary(t => t.TermID, t => t.Name);
4

3 に答える 3

5

Enumerable.ToDictionaryはIEnumerableオブジェクトで機能します。ステートメント「(from ... select term」)の最初の部分は、IQueryableオブジェクトです。Queryableは式を調べて、SQLステートメントを作成します。次に、それをIEnumerableに変換して、ToDictionary()に渡します。

言い換えれば、はい、2番目のバージョンの方が効率的です。

于 2010-01-16T21:44:20.543 に答える
3

生成されたSQLは用語全体を返すため、2番目のステートメントは必要なものだけを取得します。

dataContext.Log = Console.Outクエリのさまざまな結果を設定して確認できます。

サンプルのLINQPadデータベースを使用して、次の例を示します。

var dc = (TypedDataContext)this;

// 1st approach
var query = Orders.Select(o => o);
dc.GetCommand(query).CommandText.Dump();
query.ToDictionary(o => o.OrderID, o => o.OrderDate).Dump();

// 2nd approach
var query2 = Orders.Select(o => new { o.OrderID, o.OrderDate});
dc.GetCommand(query2).CommandText.Dump();
query2.ToDictionary(o => o.OrderID, o => o.OrderDate).Dump();

生成されたSQLは次のとおりです(またはLINQPadの[SQL]タブを確認してください)。

// 1st approach
SELECT [t0].[OrderID], [t0].[OrderDate], [t0].[ShipCountry]
FROM [Orders] AS [t0]

// 2nd approach
SELECT [t0].[OrderID], [t0].[OrderDate]
FROM [Orders] AS [t0]
于 2010-01-16T21:43:50.310 に答える
1

No.はnotToDictionaryの拡張方法です。必要はありませんが、各アイテムを盲目的に呼び出すだけです。LINQやその下にある式ツリーなどについては気にしません(そして知りません)。シーケンスを繰り返して辞書を作成するだけです。結果として、最初のクエリでは、すべての列がフェッチされます。IEnumerable<T>IQueryable<T>Expression<Func<T, TKey>>Func<T, TKey>

于 2010-01-16T21:43:42.790 に答える