3

SQL では、反復ベース (つまり、ループ) ではなく、セットベースの操作を常に心がける必要があります。.NET では、コレクションとオブジェクトを頻繁にループします。.NET にセットベースの処理を可能にするコマンドはありますか?それともすべて反復ベースですか? (結果セット内の各レコードを反復するDataAdapter.Fill呼び出し方法を思い出しました)。DataReader私は にあまり詳しくありませんLINQが、その実装は単に舞台裏で行われている反復を隠しているだけだと思います。


アップデート:

明確にするために、私はここで天才だと主張しているわけではありません。また、私の人生のプログラミングをより良くする素晴らしい人々を推測しているわけでもありません。SQL が you のときに行うように、セットベースの操作を実行するコマンドがあるかどうかを単純に尋ねているのに対し、UPDATEどちらforeach(var item in obj) { ... }がオブジェクトを明確に繰り返しているかを尋ねています。SQL 開発者は、ループを使用するたびに非難されますが、.NET では常にループを使用しています。SQL と .NET の両方で頻繁に作業する開発者として、ループを完全に回避する .NET の代替手段があるかどうかを尋ねています。

4

2 に答える 2

5

私は LINQ にあまり詳しくありませんが、LINQ の実装は単に舞台裏で行われている反復を隠しているだけだと思います。

SQLはどのようにそれを行うと思いますか? 反復が起こらないわけではありません。コードで意図をどのように表現するかが問題です。セットベースの宣言型操作は、必要なものをプラットフォームに伝え、それを実行する最善の方法を見つけるためにプラットフォームに任せます。この種のコードを許可するプラットフォームは、その分野の専門家システムであり、人間が期待するよりもはるかに優れているため、機能します。一方、命令型または手続き型のコードは、何をどのように行うかをプラットフォームに正確に伝えます。これにより、マシンの最適化の余地が少なくなり、通常はより多くのコードが必要になり、バグが発生しやすくなります。

于 2010-10-07T13:11:35.053 に答える
0

LINQ-to-SQL クエリは、完全にセットベースの操作です。GetEnumerator反復が発生するのは、直接またはforeachステートメントを介してを呼び出したときだけです。

これが機能するのは、LINQ-to-SQL が IQueryable<T> (T はテーブルのサロゲートとして機能するクラス) で始まり、IQueryable<> に適用する各 LINQ 操作が別の IQueryable<> を返すためです。舞台裏では、LINQ はデータベースにまったくアクセスしていませんが、その代わりにますます複雑な LINQ 式を構築しています。最後に結果を列挙するように要求すると、LINQ は式全体を取得し、単一の要求としてデータベースに送られる SQL クエリに変換します。

于 2010-10-07T13:11:22.783 に答える