我有以下代码。查询需要大约30秒才能执行。我发现每次调用顶层using
块时for each
都会尝试枚举迭代器。对枚举器中的每个调用MoveNext
执行哪个查询。为什么在包含yield return的函数中重复使用(){}块?
那么为什么懒惰的评估一次又一次地重塑using
。我知道周围的工作,但我需要了解这个目的。
private IEnumerable<FriendProfile> GetProfiles() {
var query = @"
SELECT VirtualNumber, City, Gender, Nick, Age
FROM Profiles
WHERE Not VirtualNumber In (SELECT VirtualNumber FROM Messages)
ORDER BY Id DESC;";
using (var con = GetConnection()) {
using (var cmd = dbconnection.CreateCommand()) {
cmd.CommandText = query;
var reader = cmd.ExecuteReader();
while (reader.Read()) {
var fp = new FriendProfile();
fp.VirtualNumber = reader.GetString(0);
fp.City = reader.GetString(1);
fp.Gender = reader.GetString(2);
fp.Nick = reader.GetString(3);
fp.Age = reader.GetInt16(4).ToString();
yield return fp;
}
}
}
}
foreach(var fp in GetProfiles()){
.... //foreach item using(){} in GetProfile() is reinitializes. All usings blocks
}
你对我是一个错误。 `IEnumerable a = Test();`我在多个循环中使用了多个时间。为每个调用`a.GetEnumerator()`迭代,这就是为什么以前的枚举器是垃圾收集或处置。我应该保存`var b = Test()。GetEnumerator()`并多次使用它。 –
affan
2010-11-27 21:24:04