3

Linq は特定のデータ ソースに対してのみクエリを実行できるように思えます。つまり、Linq はデータ ソースを参照し、必要に応じてデータを返しますが、何も変更しません。しかし、この件に関して私が見つけたいくつかの回答の文言は、この理解に疑問を投げかけています。私の理解はすべての状況で正しいですか?linq クエリは、関連付けられているデータ ソースのコンテンツを変更できますか?

4

1 に答える 1

7

linq クエリは、関連付けられているデータ ソースのコンテンツを変更できますか?

はい、これは悪い考えですが。

LINQ クエリ (少なくとも LINQ to Objects では) は、フィルター操作またはマッピング操作にデリゲートを使用して機能します。一般に、これらが副作用を引き起こすことは決してありませんが、強制した場合に副作用が発生しないという意味ではありません。実際の LINQ メソッドはデータを変更しませんが、指定したコードであるデリゲートを介して機能します。つまり、コードは何でもできるということです。

一般的に、これは悪い考えであることに注意してください。

たとえば、Personインスタンスのコレクションに対してクエリを実行しているとします。

var results = people.Where(p => p.Name == "Foo")
                    .Select(p =>
                            {
                               // This is evil, don't do it!
                               p.Name = "Bar";
                               return p;
                            });

そうは言っても、これは an に対して LINQ で機能する可能性は低いIQueryable<T>です。その場合、提供するラムダは に変換さExpressionれ、プロバイダーによって別の形式に変換される必要があります (つまり、Entity Framework はこれを SQL に変換します)。そのため、プロバイダーが意味のある形式に変換されるように記述されている場合にのみ、副作用を作成できますが、これはほとんどありません。

于 2013-10-10T21:39:27.520 に答える