104

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

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

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

4

3 に答える 3

121
  • それらはすべて 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 に反します。Microsoft の ORM が登場する前は、ADO.NET でできることは DataSets、DataTables などを返すことだけでした。Linq -to-DataSets は、これらのデータ ストアにデータを照会します。したがって、この場合、データベース バックエンドから DataTable または DataSets (System.Data 名前空間) を返し、LINQ 構文を使用してそれらをクエリします。

于 2010-03-14T21:26:40.663 に答える
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-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 クエリを実行する方が、ネットワーク経由でデータベース全体をロードしてからクライアントでフィルタリングするよりも高速です。ただし、どちらにも理想的なシナリオと明らかに間違ったシナリオがあります。

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

于 2010-03-14T21:29:33.620 に答える
32

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

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

そのデータ ソースは、XML ファイル ( Linq to XML ) の場合もあります。
または、単純なオブジェクトの単なる Collection クラスでさえも - Linq to Objects .

LINQ はクエリ テクノロジを表し、残りの名前はクエリ対象のデータ ソースを表します。

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

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

Linq to SQLを使用して、データベースにマップする .net クラスを定義すると、Linq-to-SQL が SQL サーバー データベースからデータをロードします。

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

于 2010-03-14T21:27:24.710 に答える