我对编译和优化 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()
被调用吗?stuff
recordName
仅当等于“foobar”时才需要。将为DoSomethingIntensiveWith()
每条记录执行还是仅对recordName
等于“foobar”的记录执行?
如果我想确保DoSomethingIntensiveWith()
只在
recordName
等于“foobar”时调用,我是否需要将let
caluse放在
where
子句之后,如下所示:
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);
}
与此同时,我将使用一些真实的代码和调试器。我会报告我的发现。