1

私はこのLinQを持っています:

var IPI = item.INV_TAXES.Where(t => t.TAXTYPES.TAXNAME == "IPI")
                        .Select(t => new {TOT_AMT = t.TAXVALUE, t.TAXFACTOR, t.TAXBASE})
                        .First();

次に、コードの後で、次の行を約10回呼び出します。

PerformSomeCalculation(IPI.TOT_AMT);
PerformAnotherStuff(IPI.TOT_AMT,IPI.TAXVALUE);
PerformSomethingElse(IPI.TAXBASE);

IPIの各メンバーに電話をかけるたびに、LinQが実行されるのでしょうか、それとも初めて割り当てるのでしょうか。

最初にIPIメンバーを変数に割り当てる方が良いですか?

decimal IPI_TOT_AMT = IPI.TOT_AMT,
        IPI_TAXVALUE = IPI.TAXVALUE,
        IPI_TAXBASE = IPI.TAXBASE;

そして、それらを使用します。

すべてのアドバイスをありがとう。

4

5 に答える 5

7

まず、あなたのコードで叫ぶのをやめてください。

あなたが心配するのは正しいです。結果が変わる可能性があるため、クエリはアクセスするたびに新しく実行されます。しかし、の結果はFirstクエリではなく、値です。

つまり、これを行った場合:

var query = whatever.Where(whatever).Select(whatever);
Console.WriteLine(query.First());
Console.WriteLine(query.First());

次に、クエリは1 行目で作成され、2 行目で実行され、3 行目で再度実行されます。クエリは、 を 2 回目に呼び出したときに最初の結果が異なるかどうかわからないFirstため、クエリを再度実行します。

対照的に、これを行うと:

var query = whatever.Where(whatever).Select(whatever);
var first = query.First();
Console.WriteLine(first);
Console.WriteLine(first);

次に、1 行目でクエリを作成し、2 行目でクエリを実行して結果を保存し、3 行目と 4 行目で保存した結果を報告します。

于 2012-04-10T22:27:31.907 に答える
4

提供したコードでは、メソッドを呼び出したときにのみ LINQ クエリが実行されます.First()

アクセスする前にメンバーを変数に割り当てても、顕著なパフォーマンスの向上はありません。

これは、すべての LINQ ステートメントに当てはまるとは限らないことに注意してください。たとえば、次のように言ったとします。

var IPIs = item.INV_TAXES.Where(t => t.TAXTYPES.TAXNAME == "IPI")
                     .Select(t => new {TOT_AMT = t.TAXVALUE, t.TAXFACTOR, t.TAXBASE});

...そして、IPI をいくつかのメソッドに渡すと、最終的には別々のデータベース ラウンドトリップになる可能性があります。この問題を回避するに.ToList()は、変数を割り当てる前に即時評価を強制するように呼び出します。しかし、この場合、呼び出し.First()は実質的に同じことを行います。

于 2012-04-10T22:18:44.963 に答える
1

Eric Lippert による回答は、あなたが望んでいたすべてを説明しています。ただし、最適化をさらに進めたい場合は、CompiledQuery.Compile メソッドを使用して、クエリを保存して再利用することができます。

詳細については、msdn を確認してください。ここから開始できます: http://msdn.microsoft.com/cs-cz/library/bb399335.aspx

于 2013-01-14T11:24:49.180 に答える
1

IPI の各メンバーを呼び出すたびに、LinQ が毎回実行されるか、それとも最初に割り当てられたときにだけ実行されますか?

いいえ、クエリは1 回IPIだけ実行されます。一連のプリミティブ プロパティ (実際には 10 進数) を持つ匿名型のインスタンスです。 このオブジェクトはクエリに接続されていません - クエリが実行され、First()拡張メソッドの結果としてこのオブジェクトが返されました。拡張メソッドは即時実行を強制し、入力コレクションの最初の項目を返します。

于 2012-04-10T22:18:51.333 に答える
0

First() メソッドは linq クエリを実行し、最初のオブジェクトを返します。このオブジェクトは、使用する他のオブジェクトと同様に型指定されます。唯一の違いは、クラス定義がコンパイラによって記述されることです。

したがって、オブジェクトを使用しても何も実行されません

于 2012-04-10T22:20:44.320 に答える