Linq-overview

提供:Dev Guides
移動先:案内検索

LINQ-概要

世界中の開発者は、定義されたパスがなく、SQL、Webサービス、XQueryなどの複数のテクノロジーを習得する必要があるため、データのクエリで常に問題に直面しています。

Visual Studio 2008で導入され、Anders Hejlsbergによって設計されたLINQ(Language Integrated Query)は、SQL、XMLなどのクエリ言語の知識がなくてもクエリを記述できます。 LINQクエリは、さまざまなデータタイプに対して記述できます。

LINQクエリの例

C#

using System;
using System.Linq;

class Program {
   static void Main() {

      string[] words = {"hello", "wonderful", "LINQ", "beautiful", "world"};

     //Get only short words
      var shortWords = from word in words where word.Length <= 5 select word;

     //Print each word out
      foreach (var word in shortWords) {
         Console.WriteLine(word);
      }

      Console.ReadLine();
   }
}

VB

Module Module1
   Sub Main()
      Dim words As String() = {"hello", "wonderful", "LINQ", "beautiful", "world"}

      ' Get only short words
      Dim shortWords = From word In words _ Where word.Length <= 5 _ Select word

      ' Print each word out.

      For Each word In shortWords
         Console.WriteLine(word)
      Next

      Console.ReadLine()
   End Sub
End Module

上記のC#またはVBのコードをコンパイルして実行すると、次の結果が生成されます-

hello
LINQ
world

LINQの構文

LINQには2つの構文があります。 これらは次のものです。

ラムダ(メソッド)構文

var longWords = words.Where( w ⇒ w.length > 10);
Dim longWords = words.Where(Function(w) w.length > 10)

クエリ(内包表記)構文

var longwords = from w in words where w.length > 10;
Dim longwords = from w in words where w.length > 10

LINQの種類

LINQの種類について簡単に説明します。

  • オブジェクトへのLINQ
  • LINQ to XML(XLINQ)
  • LINQ to DataSet
  • LINQ to SQL(DLINQ)
  • エンティティへのLINQ

上記とは別に、MicrosoftのパラレルLINQであるPLINQというLINQタイプもあります。

.NETのLINQアーキテクチャ

LINQには、最上層が言語拡張で構成され、最下層がIEnumerable <T>またはIQueryable <T>ジェネリックインターフェイスを実装するオブジェクトであるデータソースで構成される3層アーキテクチャがあります。 アーキテクチャを以下に示します。

LINQアーキテクチャ

クエリ式

クエリ式はLINQクエリに過ぎず、Select、Where、OrderByなどのクエリ演算子を使用したSQLの形式に似た形式で表現されます。 クエリ式は通常、キーワード「From」で始まります。

標準のLINQクエリ演算子にアクセスするには、名前空間System.Queryをデフォルトでインポートする必要があります。 これらの式は、C#3.0であった宣言クエリ構文内に記述されています。

以下は、データソースの作成、クエリ式の定義、クエリの実行で構成される完全なクエリ操作を示す例です。

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Operators {
   class LINQQueryExpressions {
      static void Main() {

        //Specify the data source.
         int[] scores = new int[] { 97, 92, 81, 60 };

        //Define the query expression.
         IEnumerable<int> scoreQuery = from score in scores where score > 80 select score;

        //Execute the query.

         foreach (int i in scoreQuery) {
            Console.Write(i + " ");
         }

         Console.ReadLine();
      }
   }
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

97 92 81

拡張メソッド

NET 3.5で導入された拡張メソッドは、静的クラスでのみ宣言され、オブジェクトにカスタムメソッドを含めることで、正確なクエリ操作を実行して、そのクラスの実際のメンバーにならずにクラスを拡張できます。 これらも過負荷になる可能性があります。.

簡単に言うと、拡張メソッドを使用して、クエリ式を従来のメソッド呼び出し(オブジェクト指向)に変換します。

LINQとストアドプロシージャの違い

LINQプロシージャとストアドプロシージャには、さまざまな違いがあります。 これらの違いを以下に示します。

  • ストアドプロシージャは、予想される実行計画に従うため、LINQクエリよりもはるかに高速です。
  • 前者はVisual StudioのIntellisenseをサポートし、コンパイル時の完全な型チェックを行うため、ストアドプロシージャに比べて、LINQクエリの実行中にランタイムエラーを回避するのは簡単です。
  • LINQでは、ストアドプロシージャの場合ではない.NETデバッガーを使用してデバッグできます。
  • LINQは、ストアドプロシージャとは異なり、複数のデータベースをサポートします。ストアドプロシージャでは、さまざまな種類のデータベースのコードを書き直すことが不可欠です。 *LINQベースのソリューションの展開は、一連のストアドプロシージャの展開に比べて簡単でシンプルです。

LINQの必要性

LINQより前は、C#、SQL、および両方を結合して完全なアプリケーションを形成するさまざまなAPIを学ぶことが不可欠でした。 なぜなら、これらのデータソースとプログラミング言語はインピーダンスの不一致に直面しているためです。短いコーディングの必要性が感じられます。

以下は、LINQの登場前にデータを照会する際に開発者が使用した多様な手法の例です。

SqlConnection sqlConnection = new SqlConnection(connectString);
SqlConnection.Open();

System.Data.SqlClient.SqlCommand sqlCommand = new SqlCommand();
sqlCommand.Connection = sqlConnection;

sqlCommand.CommandText = "Select* from Customer";
return sqlCommand.ExecuteReader (CommandBehavior.CloseConnection)

興味深いことに、機能コード行のうち、クエリは最後の2行のみで定義されます。 LINQを使用すると、同じデータクエリを、非常に短い時間で以下に説明するように、読み取り可能な色分けされた形式で記述できます。

Northwind db = new Northwind(@"C:\Data\Northwnd.mdf");
var query = from c in db.Customers select c;

LINQの利点

LINQには多くの利点がありますが、その中で最も重要なのは、開発者が宣言的に表現できる強力な表現力です。 LINQのその他の利点のいくつかを以下に示します。

  • LINQは、設計時に間違いを見つけるのに役立つ構文の強調表示を提供します。
  • LINQはIntelliSenseを提供します。これにより、より正確なクエリを簡単に作成できます。
  • LINQではコードの記述が非常に高速であるため、開発時間も大幅に短縮されます。
  • LINQは、C#言語に統合されているため、簡単にデバッグできます。
  • LINQの階層機能により、2つのテーブル間の関係を簡単に表示できます。これにより、複数のテーブルを結合するクエリを短時間で作成できます。
  • LINQでは、多くの多様なデータソースを照会しながら単一のLINQ構文を使用できます。これは主に、その統一的な基盤のためです。
  • LINQは拡張可能であるため、LINQの知識を使用して新しいデータソースの種類を照会することができます。
  • LINQは、複数のデータソースを1つのクエリに結合し、複雑な問題をデバッグしやすい短いクエリのセットに分割する機能を提供します。
  • LINQは、SQLデータをXMLデータに変換するように、あるデータ型を別のデータ型に変換するための簡単な変換を提供します。