LINQ 式のコンパイルと最適化、および式の let 句と where 句の順序を慎重に検討する必要があるかどうかに関心があります。
次に例を示します。
var query =
from record in Database.Table
let recordName = record.GetName()
let notUsed = UselessData()
let stuff = DoSomethingIntensiveWith(record)
where recordName == "foobar"
select stuff;
foreach (string item in query) {
Console.WriteLine("item => '{0}'", item);
}
質問/仮定:
record.GetName()where句を実行するには解決する必要があります。notUsed式で使用されることはないのでUselessData()、まったく呼び出されますか?stuffrecordName「foobar」と等しい場合にのみ必要です。DoSomethingIntensiveWith()すべてのレコードに対して実行されますか、または「foobar」に等しいレコードのみに対して実行されますrecordNameか?
「foobar」に等しいDoSomethingIntensiveWith()場合にのみ呼び出される
ようにしたい場合は、次のように、節の後にカルセ
を配置する必要がありますか?recordNameletwhere
var query =
from record in Database.Table
let recordName = record.GetName()
let notUsed = UselessData()
where recordName == "foobar"
let stuff = DoSomethingIntensiveWith(record)
select stuff;
foreach (string item in query) {
Console.WriteLine("item => '{0}'", item);
}
それまでの間、実際のコードとデバッガーで遊んでみます。見つけたものはまた報告します。