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つの構文があります。これらは以下のものです。

Lamda(メソッド)構文

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からXML(XLINQ)
  • LINQ to DataSet
  • LINQ to SQL(DLINQ)
  • エンティティへのLINQ

上記とは別に、Microsoftの並列LINQであるPLINQという名前のLINQタイプもあります。

.NETのLINQアーキテクチャ

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

クエリ式

クエリ式は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クエリよりもはるかに高速です。

  • 前者はVisualStudioの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は、単一のクエリで複数のデータソースを結合する機能と、複雑な問題をデバッグしやすい短いクエリのセットに分割する機能を提供します。

  • LINQは、SQLデータをXMLデータに変換するように、あるデータ型を別のデータ型に変換するための簡単な変換を提供します。