迭代器块的延迟加载行为导致缓存数据困难。考虑这个小测试程序:
class Program
{
static IEnumerable<int> LoadDataFromDatabase()
{
Console.WriteLine("Hitting database....");
yield return 13;
}
static IEnumerable<int> _cachedData = null;
static IEnumerable<int> CachedData
{
get
{
if (_cachedData == null)
{
_cachedData = LoadDataFromDatabase();
}
return _cachedData;
}
}
static void Main(string[] args)
{
Console.WriteLine(string.Format("Collection contains {0} items.", CachedData.Count()));
Console.WriteLine(string.Format("Collection contains {0} items.", CachedData.Count()));
}
}
对此的输出是
击中数据库....
集合包含 1 个项目。
击中数据库....
集合包含 1 个项目。
我只想访问数据库一次(因此缓存),但因为LoadDataFromDatabase()
是一个迭代器块,实际的数据库调用是缓存的内容——而不是数据。
在这种情况下,最佳做法是什么?我应该只_cachedData = LoadDataFromDatabase().ToList()
存储评估的数据吗?