イテレータ ブロックの遅延読み込み動作により、データのキャッシュに問題が発生しています。次の小さなテスト プログラムを検討してください。
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 個のアイテムが含まれています。
データベースを 1 回だけヒットしたい (したがってキャッシュ)LoadDataFromDatabase()
が、イテレータ ブロックであるため、実際のデータベース呼び出しはキャッシュされるものであり、データではありません。
このシナリオでのベスト プラクティスは何ですか? _cachedData = LoadDataFromDatabase().ToList()
評価されたデータを保存するだけでいいですか?