2017-06-16 23 views
1

現在、Entity Frameworkを使用するいくつかのコードをリファクタリングしています。Entity FrameworkでLinq Any()の副作用

誰かがEntities.Any()と呼んでいる理由はわかりませんが、ランダムに見えますが、読み込まれた値がレイジーに上書きされるというコメントがあります。 Any()と呼んでも、基本となるコレクションを変更しないでください。

このステートメントを削除しても問題ありませんか?

コードは次のようになります。

class MyEFObject { 

    public virtual ICollection<Entity> Entities { get; set; } 

    public void SetEntities(ICollection<Entity> entities) 
    { 
     // [...] 

     Entities.Any(); // to override lazyloaded values 
     Entities = entities.Where(a => a.MyEFObjectId == Id).ToList(); 

     // [...] 
    } 

} 

もちろん、私が意図した動作が何であるかを確認することができないので、何のテストはありません。

+0

この記事を見てくださいhttps://www.tutorialspent.com/entity_framework/entity_framework_lazy_loading.htm –

+1

「エンティティ」はメモリ内のコレクションであるように見えますが、これは置き換えようとしています。 'Any()'は、そのコレクションに少なくとも1つのアイテムがあるかどうかをチェックします(そして、結果を破棄します)。私はそれがおそらく何の効果もないのを見ることはできません。 –

+1

私はそのコードを削除しません。 'Any.'はここでは必須ではありません(' GC.KeepAlive(Entities);や同様の擬似メソッドは同じ効果があります)。必須は 'Entities'プロパティ* getter *を呼び出すことです。 –

答えて

1

Any()は、指定された述語に一致するコレクション内に1つ以上のアイテムがあるかどうかをチェックするだけです。述語がなければ(あなたの場合のように)、コレクションに少なくとも1つのアイテムがあるかどうかをチェックします。

あなたのコレクションでは何も変更されませんが、それは同僚が達成したいと思っていたものです。ランタイムがデータベースから値を取得するために式をエバリュートするよう強制します。ご存知のように、IEnumerableまたはIQueryableを返す式は実行する必要がない限り実行されません。式の戻り値に依存するその式への最初の呼び出しは強制的に実行され、SQLプロファイラには入力文が表示されることがあります。

しかし、以下の行はToList()を呼び出し、式がすぐに実行されることを確認しています。だから、あなたは本当にその必要はありませんAny()

+0

私は同意します。私はそこに持っていることに何の価値も見ません。 – Cory

+0

https://stackoverflow.com/a/31556934/3825611 – Cory

関連する問題