2017-08-01 8 views
1

私はLazy<T>を使用して一度ロードしたいEntity Frameworkを使用して、いくつかの簡単なデータベースクエリを持っていますが、プロパティが呼び出されるたびにクエリが実行されることがわかります。私が試してみましたバリエーションは、以下のとおりです。なぜLazy <T>は怠惰ではありませんか?

public static IEnumerable<string> Foos => new Lazy<IEnumerable<string>>(() => _db.Foos.Select(x => x.Name)).Value; 

public static IEnumerable<string> Foos=> new Lazy<IEnumerable<string>>(() => _db.Foos.Select(x => x.Name).ToArray()).Value; 

public static Lazy<IEnumerable<string>> Foos => new Lazy<IEnumerable<string>>(() => _db.Foos.Select(x => x.Name).ToArray()); 

public static IEnumerable<string> LightingEnvironments 
{ 
    get 
    { 
     var lazy = new Lazy<IEnumerable<string>>(() => _db.Foos.Select(x => x.Name).ToArray()); 
     return lazy.Value; 
    } 
} 
+1

これは間違っているためです。プロパティの外部でインスタンスを作成し、プロパティ内の値にアクセスします。 https://msdn.microsoft.com/en-us/library/dd642331(v=vs.110).aspx – Nkosi

答えて

9

あなたはプロパティのゲッターを呼び出して新しいLazyたびに構築しています。 Lazyだけで、あなたが値を必要とするたびに周りLazyインスタンスを保持し、同じLazyインスタンス上Valueプロパティを呼び出す場合は、すでに構築された値を再利用することができます。