web-dev-qa-db-ja.com

「LINQ to Entities」、「LINQ to SQL」、「LINQ to Dataset」の違いは何ですか

私はLINQでかなり長い間働いています。ただし、前述のLINQのフレーバーの本当の違いは少し謎のままです。

成功した答えには、それらの間の短い区別が含まれます。各フレーバーの主な目標は何ですか、利点は何ですか、パフォーマンスへの影響はありますか...

追伸私はそこに多くの情報源があることを知っていますが、特定の目標にどこに向かうべきかを初心者に指示する一種の「チートシート」を探しています。

86
Marcel
  • これらはすべて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構文を使用してそれらをクエリします

106
marc_s

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クエリを実行すると、ネットワーク経由でデータベース全体をロードしてからクライアントでフィルタリングするよりも高速です。ただし、どちらにも理想的なシナリオと単純なシナリオがあります。

ここでの目標と利点は、単一の静的チェック構文を使用してさまざまなデータソースを照会し、コードをより表現力豊かにすることです(たとえば、データをグループ化するための「伝統的な」コードではありません)何をしようとしているのかという点で非常に明確です-大量のコードで失われています)。

36
Marc Gravell

LINQは、言語統合クエリの略です。 C#内で直接「SQLスタイル」クエリ言語を使用して、データソースから情報を抽出できます。

  • そのデータソースはSQLサーバーデータベースである可能性があります-これはLinq to SQLです
  • そのデータソースは、エンティティフレームワークオブジェクトのデータコンテキストである可能性があります-Linq to entities
  • そのデータソースはADO.netデータセットである可能性があります-Linq to Dataset

そのデータソースは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を使用してこのマッピングを介して読み込まれたデータをクエリできるシステムです。

26
Simon P Stevens