私はLINQでかなり長い間働いています。ただし、前述のLINQのフレーバーの本当の違いは少し謎のままです。
成功した答えには、それらの間の短い区別が含まれます。各フレーバーの主な目標は何ですか、利点は何ですか、パフォーマンスへの影響はありますか...
追伸私はそこに多くの情報源があることを知っていますが、特定の目標にどこに向かうべきかを初心者に指示する一種の「チートシート」を探しています。
これらはすべてLINQ(言語統合クエリ)であるため、多くの共通点があります。これらの「方言」はすべて、さまざまなソースからのクエリスタイルのデータ選択を基本的に可能にします。
Linq-to-SQLは、MicrosoftのORM-Object-Relational Mapperへの最初の試みです。 SQL Serverのみをサポートします。これは、SQL Serverデータベーステーブルを.NETオブジェクトにマッピングするマッピングテクノロジーです。
Linq-to-Entitiesは同じ考えですが、ORMとしてバックグラウンドでEntity Frameworkを使用します-再びMicrosoftからですが、複数のデータベースバックエンドをサポートします
Linq-to-DataSetsはLINQですが、使用は「古いスタイル」のADO.NET 2.0 DataSetsに対するものです-MicrosoftのORMが登場する以前は、ADO.NETでできることはDataSetsを返すことだけでした、DataTablesなど、およびLinq-to-DataSetsはそれらのデータストアにデータを照会します。この場合、データベースバックエンドからDataTableまたはDataSets(System.Data名前空間)を返し、LINQ構文を使用してそれらをクエリします
LINQは、次のような(たとえば)クエリ理解構文に基づいた幅広いテクノロジセットです。
var qry = from x in source.Foo
where x.SomeProp == "abc"
select x.Bar;
コンパイラによってコードにマッピングされます:
var qry = source.Foo.Where(x => x.SomeProp == "abc").Select(x => x.Bar);
そしてここでrealマジックが始まります。ここでFoo
が何であるかを言っていないことに注意してください-そしてコンパイラは気にしません! someラムダを取ることができるWhere
と呼ばれる適切なメソッドを解決でき、その結果がsomeSelect
メソッドである限りそれはラムダを受け入れることができる、それは幸せです。
ラムダをコンパイルしてeither匿名メソッド(デリゲート、LINQ-to-DataSetを含むLINQ-to-Objectsの場合)、 または式ツリー(オブジェクトモデルのラムダを表すランタイムモデル)。
メモリ内データ(通常はIEnumerable<T>
)、デリゲートを実行するだけで、素晴らしく高速です。しかし、IQueryable<T>
式のオブジェクト表現(a LambdaExpression<...>
)それをバラバラにして、「LINQ-to-Something」の例に適用できます。
データベース(LINQ-to-SQL、LINQ-to-Entities)の場合、TSQLを記述することを意味する場合があります。例:
SELECT x.Bar
FROM [SomeTable] x
WHERE x.SomeProp = @p1
しかし、それは(たとえばADO.NET Data Servicesの場合)HTTPクエリを記述することを意味します。
少量のデータを返す適切に作成されたTSQLクエリを実行すると、ネットワーク経由でデータベース全体をロードしてからクライアントでフィルタリングするよりも高速です。ただし、どちらにも理想的なシナリオと単純なシナリオがあります。
ここでの目標と利点は、単一の静的チェック構文を使用してさまざまなデータソースを照会し、コードをより表現力豊かにすることです(たとえば、データをグループ化するための「伝統的な」コードではありません)何をしようとしているのかという点で非常に明確です-大量のコードで失われています)。
LINQは、言語統合クエリの略です。 C#内で直接「SQLスタイル」クエリ言語を使用して、データソースから情報を抽出できます。
そのデータソースはXMLファイルでもある可能性があります-Linq to XML。
またはプレーンオブジェクトのコレクションクラスでさえも-Linq to Objects。
LINQはクエリテクノロジを表し、残りの名前はクエリ対象のデータのソースを表します。
追加の背景:
Datasetsは、データがデータベースから.netデータセットにロードされるADO.netオブジェクトであり、Linqを使用して、ロード後にそのデータを照会できます。
Linq to SQLを使用すると、データベースにマップする.netクラスを定義し、Linq-to-SQLがSQLサーバーデータベースからのデータのロードを処理します。
そして最後にEntity frameworkは、データベースとオブジェクトマッピングをXMLで定義し、Linqを使用してこのマッピングを介して読み込まれたデータをクエリできるシステムです。