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


91

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

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

PS世の中にはたくさんの情報源があることは知っていますが、初心者に特定の目標に向けてどこに向かうべきかを指示する一種の「チートシート」を探しています。


回答:


110
  • それらはすべてLINQ(Language Integrated Query)であるため、それらはすべて多くの共通点を共有しています。これらすべての「方言」は、基本的に、さまざまなソースからのクエリスタイルのデータ選択を可能にします。

  • Linq-to-SQLは、ORM-オブジェクトリレーショナルマッパーでのMicrosoftの最初の試みです。SQL Serverのみをサポートします。SQL Serverデータベーステーブルを.NETオブジェクトにマップするためのマッピングテクノロジーです。

  • Linq-to-Entitiesは同じアイデアですが、バックグラウンドでEntity FrameworkをORMとして使用しています。これもMicrosoftによるものですが、複数のデータベースバックエンドをサポートしています。

  • Linq-to-DataSetsはLINQですが、「古いスタイル」のADO.NET 2.0 DataSetsを使用しています-ORMがMicrosoftから登場する以前は、ADO.NETでできることはすべて、DataSets、DataTablesなどを返していました。 -to-DataSetsは、これらのデータストアにデータを照会します。したがって、この場合、データベースバックエンドからDataTableまたはDataSets(System.Data名前空間)を返し、次にLINQ構文を使用してそれらをクエリします。


1
5万円おめでとうございます。これで正式にStackOverflowに多くの時間を費やしました。;)
アーロンノート、

1
@Aaronaught:ありがとう-そしてあなたは完全に正しいです!:-)お奨めは、すべての人に1つの中毒を残します。お願いします?!?!?!
marc_s 2010年

1
marc_s、この回答に感謝します。パフォーマンスについてお話いただけますか。あなたの答えから、私はLinq-to-Entitiesが最も高度で、おそらく最もパフォーマンスが高いと思いますか?
マルセル

2
@Marcel:私の直感から(難しい事実はありません)、Linq-to-SQLまたは最速(データベースとオブジェクトモデルの間の1つのレイヤーのみ)、Linq-to-Datasetが1秒近く、Linq-to -Entitiesは最後です。EntityFrameworkには常に2層のマッピングがあるためです(したがって、最も複雑です)。繰り返しになりますが、ただの
直感、それを裏付ける

3
@marc_sこれは古い投稿ですが、ほとんどの場合、LINQ to EntitiesはLINQ to Datasetよりも高速です。LINQ to Datasetは実際にはタイプではなく、データセットをオブジェクトとして使用しているオブジェクトに対するLINQです。オブジェクトを介したLINQはSQLを実行しないため、最初にSQLソースからデータセットを作成する必要があります。オブジェクトを介したLINQは、データをデータセットに取得する際にクエリの最適化を実行できません。すべての列がボックス化されており、そのすべての型シフトがパフォーマンスを低下させるため、それとデータセットはひどいパフォーマンスです。
Robert McKee 2013年

38

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);

ここから本当の魔法が始まります。ここでは何も言っていないことに注意してFooください-そしてコンパイラは気にしません!それがラムダをとることができるいくつかの適切なメソッドを解決Whereでき、その結果がラムダを受け入れることができるいくつかの Selectメソッドを持っている限り、それは幸せです。

今ラムダをコンパイルすることができると考えるのいずれか、(LINQツーオブジェクトLINQツーデータセットを含む、の委譲)匿名メソッドにまたはオブジェクトモデルでラムダを表す式ツリー(ランタイムモデルに)。

インメモリデータ(通常は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データサービスの場合)HTTPクエリを作成することを意味します。

少量のデータを返す適切に記述されたTSQLクエリを実行する方が、データベース全体をネットワーク経由でロードしてからクライアントでフィルタリングするよりも高速です。ただし、どちらにも理想的なシナリオと間違ったシナリオがあります。

ここでの目標と利点は、静的にチェックされた単一の構文を使用して広範囲のデータソースにクエリを実行できるようにすることと、コードをより表現力のあるものにすることです(たとえば、データをグループ化する「従来の」コードではありません)。それが何をしようとしているのかに関して非常に明確です-それはコードの塊で失われます)。


マルク、この洞察に感謝します。しかし、私はそのような詳細な内部については尋ねませんでした。-1、質問に回答しませんので、申し訳ありません。
マルセル

7
誰かが彼自身のLINQプロバイダーを書いているので、これは私がこれまで見てきた最良の答えです。私は-1について同意しません。
Dan Barowy 2013年

30

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

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

そのデータソースは、XMLファイル(Linq to XML)にすることもできます
あるいは、単なるオブジェクトのコレクションクラス-Linq to Objectsですらあります。

LINQはクエリテクノロジを表し、名前の残りの部分はクエリされるデータのソースを表します。

少し余分な背景について:

データセットは、データがデータベースから.netデータセットに読み込まれるADO.netオブジェクトであり、Linqを使用して、読み込まれたデータにクエリを実行できます。

LINQ to SQLは、データベースとLINQのツーSQLへのマップは、SQL Serverデータベースからデータをロードするの面倒を見るという.NETのクラスを定義します

最後に、エンティティフレームワークは、データベースとオブジェクトマッピングをXMLで定義し、Linqを使用して、このマッピングを介して読み込まれるデータをクエリできるシステムです。


3
実際、Linq-to-SQLはSQL Serverのみであり、単なる「任意の」SQLデータベースバックエンドではありません。
marc_s

3
@marc_s:良い場所です。ありがとう。ただし、興味があれば、必要に応じて他のデータベース用のサードパーティのLinq to sqlプロバイダーを利用できます。code2code.net/DB_Linqを参照してください。ただし、品質についてはコメントできません。
Simon P Stevens

1
Simon、特にEntitiyフレームワークの役立つ2行の要約に感謝します。+1
マルセル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.