Linq-quick-guide

提供: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データに変換するように、あるデータ型を別のデータ型に変換するための簡単な変換を提供します。

LINQ-環境設定

LINQプログラムを開始する前に、まずLINQ環境をセットアップすることの微妙な違いを理解することが最善です。 LINQには、さまざまな種類のアプリケーションを使用するための革新的なプラットフォームである.NETフレームワークが必要です。 LINQクエリは、C#またはVisual Basicで簡単に記述できます。

Microsoftは、これらの両方の言語用のツールを提供しています。 Visual StudioによるC#およびVisual Basic。 サンプルはすべてVisual Studio 2010でコンパイルおよび作成されています。 ただし、Visual Basic 2013エディションも使用できます。 これは最新バージョンであり、Visual Studio 2012と多くの類似点があります。

Windows 7にVisual Studio 2010をインストールする

Visual Studioは、DVDなどのインストールメディアからインストールできます。 システムにVisual Basic 2010を正常にインストールするには、管理者の資格情報が必要です。 インストール前にシステムからすべてのリムーバブルUSBを切断することが重要です。そうしないと、インストールが失敗する可能性があります。 インストールに必要なハードウェア要件には、次のものがあります。

ハードウェア要件

  • 1.6 GHz以上
  • 1 GBのRAM
  • 3 GB(利用可能なハードディスク容量)
  • 5400 RPMハードディスクドライブ
  • DirectX 9互換のビデオカード
  • DVD-ROMドライブ

インストール手順

  • ステップ1 *-Visual Studio 2010パッケージでDVDを挿入した後、画面のポップアップボックスに表示される[メディアからプログラムをインストールまたは実行]をクリックします。
  • ステップ2 *-Visual Studioのセットアップが画面に表示されます。 [Microsoft Visual Studio 2010のインストール]を選択します。

LINQ環境

  • ステップ3 *-クリックするとすぐにプロセスが開始され、セットアップウィンドウが画面に表示されます。 しばらく時間がかかるインストールコンポーネントの読み込みが完了したら、[次へ]ボタンをクリックして次の手順に進みます。

LINQ環境

  • ステップ4 *-これはインストールの最後のステップです。「ライセンス条項を読んで同意します」を選択し、「次へ」ボタンをクリックするだけのスタートページが表示されます。

LINQ環境

ステップ5 *-画面に表示されるオプションページからインストールする機能を選択します。 *Full または Custom オプションを選択できます。 ディスク容量の要件に示されている必要なディスク容量よりも少ない場合は、カスタムに進みます。

LINQ環境

  • ステップ6 *-カスタムオプションを選択すると、次のウィンドウが表示されます。 インストールする機能を選択し、[更新]をクリックするか、手順7に進みます。 ただし、今後はカスタムオプションを使用しないことをお勧めします。使用しないように選択した機能が必要になる場合があります。

LINQ環境

  • ステップ7 *-すぐにポップアップウィンドウが表示され、インストールに時間がかかります。 これは、すべてのコンポーネントをインストールするためのものです。

LINQ環境

  • ステップ8 *-最後に、インストールが正常に完了したというメッセージをウィンドウに表示できます。 *完了*をクリックします。

LINQ環境

Visual Studio 2010でLINQを使用してC#プログラムを作成する

  • Visual Studio 2010 Ultimateエディションを起動し、メニューから[ファイル]、[新規プロジェクト]の順に選択します。
  • 新しいプロジェクトダイアログボックスが画面に表示されます。
  • 次に、インストール済みテンプレートの下のカテゴリとしてVisual C#を選択し、次の図に示すようにコンソールアプリケーションテンプレートを選択します。

LINQ環境

  • 下部の名前ボックスにプロジェクトに名前を付けて、[OK]を押します。
  • 新しいプロジェクトは、画面上の新しいダイアログボックスの右側のソリューションエクスプローラーに表示されます。

LINQ環境

  • ソリューションエクスプローラーからProgram.csを選択すると、「システムを使用」で始まるエディターウィンドウでコードを表示できます。
  • ここで、次のC#プログラムのコーディングを開始できます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HelloWorld {
   class Program {
      static void Main(string[] args) {

         Console.WriteLine("Hello World")
         Console.ReadKey();
      }
   }
}
  • F5キーを押して、プロジェクトを実行します。 プロジェクトを実行する前に*ファイル*→*すべて保存*を選択してプロジェクトを保存することを強くお勧めします。

Visual Studio 2010でLINQを使用してVBプログラムを作成する

  • Visual Studio 2010 Ultimateエディションを起動し、メニューから[ファイル]、[新規プロジェクト]の順に選択します。
  • 新しいプロジェクトダイアログボックスが画面に表示されます。
  • ここで、インストール済みテンプレートの下のカテゴリとしてVisual Basicを選択し、次にコンソールアプリケーションテンプレートを選択します。
  • 下部の名前ボックスにプロジェクトに名前を付けて、[OK]を押します。
  • Module1.vbの画面が表示されます。 LINQを使用して、ここでVBコードの記述を開始します。
Module Module1

   Sub Main()
      Console.WriteLine("Hello World")
      Console.ReadLine()
   End Sub

End Module
  • F5キーを押して、プロジェクトを実行します。 プロジェクトを実行する前に*ファイル*→*すべて保存*を選択してプロジェクトを保存することを強くお勧めします。

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

Hello World

LINQ-クエリ演算子

クエリパターンを形成する一連の拡張メソッドは、LINQ Standard Query Operatorsと呼ばれます。 LINQクエリ式の構成要素として、これらの演算子はフィルタリング、並べ替え、投影、集計などのさまざまなクエリ機能を提供します。

LINQ標準クエリ演算子は、機能に基づいて次のカテゴリに分類できます。

  • フィルタリング演算子
  • 結合演算子
  • 投影操作
  • ソート演算子
  • グループ化演算子
  • コンバージョン数
  • 連結
  • 集約
  • 量指定子の操作
  • パーティション操作
  • 発電事業
  • セット操作
  • 平等
  • 要素演算子

フィルタリング演算子

フィルタリングは、特定の条件を満たす選択された要素のみを持つように結果セットを制限する操作です。

link:/linq/linq_filtering_operators [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
where Filter values based on a predicate function where Where
OfType Filter values based on their ability to be as a specified type Not Applicable Not Applicable

結合演算子

結合とは、相互の関係を直接的な方法で追跡することが困難なデータソースを対象とする操作を指します。

link:/linq/linq_join_operators [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
Join The operator join two sequences on basis of matching keys join … in … on … equals … From x In …, y In … Where x.a = y.a
GroupJoin Join two sequences and group the matching elements join … in … on … equals … into … Group Join … In … On …

投影操作

投影とは、オブジェクトを特定のプロパティのみを持つまったく新しいフォームに変換する操作です。

リンク:/linq/linq_projection_operations [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
Select The operator projects values on basis of a transform function select Select
SelectMany The operator project the sequences of values which are based on a transform function as well as flattens them into a single sequence Use multiple from clauses Use multiple From clauses

ソート演算子

ソート操作を使用すると、単一または複数の属性に基づいてシーケンスの要素を並べることができます。

link:/linq/linq_sorting_operators [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
OrderBy The operator sort values in an ascending order orderby Order By
OrderByDescending The operator sort values in a descending order orderby …​ descending Order By …​ Descending
ThenBy Executes a secondary sorting in an ascending order orderby …, … Order By …, …
ThenByDescending Executes a secondary sorting in a descending order orderby …, … descending Order By …, … Descending
Reverse Performs a reversal of the order of the elements in a collection Not Applicable Not Applicable

グループ化演算子

オペレーターは、共通の共有属性に基づいていくつかのグループにデータを入れます。

link:/linq/linq_grouping_operators [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
GroupBy Organize a sequence of items in groups and return them as an IEnumerable collection of type IGrouping<key, element> group … by -or- group … by … into … Group … By … Into …
ToLookup Execute a grouping operation in which a sequence of key pairs are returned Not Applicable Not Applicable

コンバージョン数

演算子は入力オブジェクトのタイプを変更し、さまざまなアプリケーションで使用されます。

link:/linq/linq_conversions [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
AsEnumerable Returns the input typed as IEnumerable<T> Not Applicable Not Applicable
AsQueryable A (generic) IEnumerable is converted to a (generic) IQueryable Not Applicable Not Applicable
Cast Performs casting of elements of a collection to a specified type Use an explicitly typed range variable. Eg:from string str in words From … As …
OfType Filters values on basis of their , depending on their capability to be cast to a particular type Not Applicable Not Applicable
ToArray Forces query execution and does conversion of a collection to an array Not Applicable Not Applicable
ToDictionary On basis of a key selector function set elements into a Dictionary<TKey, TValue> and forces execution of a LINQ query Not Applicable Not Applicable
ToList Forces execution of a query by converting a collection to a List<T> Not Applicable Not Applicable
ToLookup Forces execution of a query and put elements into a Lookup<TKey, TElement> on basis of a key selector function Not Applicable Not Applicable

連結

2つのシーケンスの連結を実行します。これは、重複を削除しないという事実を除いて、操作に関してはUnion演算子に非常に似ています。

link:/linq/linq_concatenation [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
Concat Two sequences are concatenated for the formation of a single one sequence. Not Applicable Not Applicable

集約

任意のタイプの必要な集計を実行し、LINQでカスタム集計を作成できます。

link:/linq/linq_aggregation [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
Aggregate Operates on the values of a collection to perform custom aggregation operation Not Applicable Not Applicable
Average Average value of a collection of values is calculated Not Applicable Aggregate … In … Into Average()
Count Counts the elements satisfying a predicate function within collection Not Applicable Aggregate … In … Into Count()
LonCount Counts the elements satisfying a predicate function within a huge collection Not Applicable Aggregate … In … Into LongCount()
Max Find out the maximum value within a collection Not Applicable Aggregate … In … Into Max()
Min Find out the minimum value existing within a collection Not Applicable Aggregate … In … Into Min()
Sum Find out the sum of a values within a collection Not Applicable Aggregate … In … Into Sum()

量指定子の操作

これらの演算子はブール値、つまり シーケンス内の一部またはすべての要素が特定の条件を満たす場合に真または偽。

link:/linq/linq_quantifier_operations [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
All Returns a value ‘True’ if all elements of a sequence satisfy a predicate condition Not Applicable Aggregate … In … Into All(…)
Any Determines by searching a sequence that whether any element of the same satisfy a specified condition Not Applicable Aggregate … In … Into Any()
Contains Returns a ‘True’ value if finds that a specific element is there in a sequence if the sequence doe not contains that specific element , ‘false’ value is returned Not Applicable Not Applicable

パーティション演算子

入力シーケンスを2つのセクションに分割します。シーケンスの要素を並べ替えてから1つを返すことはありません。

link:/linq/linq_partition_operators [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
Skip Skips some specified number of elements within a sequence and returns the remaining ones Not Applicable Skip
SkipWhile Same as that of Skip with the only exception that number of elements to skip are specified by a Boolean condition Not Applicable Skip While
Take Take a specified number of elements from a sequence and skip the remaining ones Not Applicable Take
TakeWhile Same as that of Take except the fact that number of elements to take are specified by a Boolean condition Not Applicable Take While

発電事業

世代演算子によって新しい値のシーケンスが作成されます。

リンク:/linq/linq_generation_operations [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
DefaultIfEmpty When applied to an empty sequence, generate a default element within a sequence Not Applicable Not Applicable
Empty Returns an empty sequence of values and is the most simplest generational operator Not Applicable Not Applicable
Range Generates a collection having a sequence of integers or numbers Not Applicable Not Applicable
Repeat Generates a sequence containing repeated values of a specific length Not Applicable Not Applicable

セット操作

集合演算には4つの演算子があり、それぞれ異なる基準に基づいて結果を生成します。

link:/linq/linq_set_operations [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
Distinct Results a list of unique values from a collection by filtering duplicate data if any Not Applicable Distinct
Except Compares the values of two collections and return the ones from one collection who are not in the other collection Not Applicable Not Applicable
Intersect Returns the set of values found t be identical in two separate collections Not Applicable Not Applicable
Union Combines content of two different collections into a single list that too without any duplicate content Not Applicable Not Applicable

平等

2つの文(列挙可能)を比較し、それらが完全に一致するかどうかを判断します。

link:/linq/linq_equality [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
SequenceEqual Results a Boolean value if two sequences are found to be identical to each other Not Applicable Not Applicable

要素演算子

DefaultIfEmptyを除き、残りの8つの標準クエリ要素演算子はすべて、コレクションから単一の要素を返します。

link:/linq/linq_element_operators [例を表示]

Operator Description C# Query Expression Syntax VB Query Expression Syntax
ElementAt Returns an element present within a specific index in a collection Not Applicable Not Applicable
ElementAtOrDefault Same as ElementAt except of the fact that it also returns a default value in case the specific index is out of range Not Applicable Not Applicable
First Retrieves the first element within a collection or the first element satisfying a specific condition Not Applicable Not Applicable
FirstOrDefault Same as First except the fact that it also returns a default value in case there is no existence of such elements Not Applicable Not Applicable
Last Retrieves the last element present in a collection or the last element satisfying a specific condition Not Applicable Not Applicable
LastOrDefault Same as Last except the fact that it also returns a default value in case there is no existence of any such element Not Applicable Not Applicable
Single Returns the lone element of a collection or the lone element that satisfy a certain condition Not Applicable Not Applicable
SingleOrDefault Same as Single except that it also returns a default value if there is no existence of any such lone element Not Applicable Not Applicable
DefaultIfEmpty Returns a default value if the collection or list is empty or null Not Applicable Not Applicable

LINQ-SQL

LINQ to SQLは、リレーショナルデータをオブジェクトとして管理するためのインフラストラクチャ(ランタイム)を提供します。 これは.NET Frameworkのバージョン3.5のコンポーネントであり、オブジェクトモデルの言語統合クエリのSQLへの変換を適切に実行します。 これらのクエリは、実行のためにデータベースに送信されます。 データベースから結果を取得した後、LINQ to SQLは再び結果をオブジェクトに変換します。

LINQ To SQLの紹介

ほとんどのASP.NET開発者にとって、LINQ to SQL(DLINQとも呼ばれます)は、Language Integrated Queryの通電部分です。これにより、通常のLINQ式を使用してSQLサーバーデータベースのデータをクエリできるようになります。 また、データの更新、削除、挿入も可能ですが、唯一の欠点は、SQLサーバーデータベースへの制限です。 ただし、ADO.NETを介したLINQ to SQLには、複雑さの軽減、コーディングの数行など、多くの利点があります。

以下は、LINQ to SQLの実行アーキテクチャを示す図です。

LINQ SQLアーキテクチャ

LINQ to SQLの使用方法

  • ステップ1 *-データベースサーバーとの新しい「データ接続」を作成します。 表示&arrar;サーバーエクスプローラー&arrar;データ接続&arrar;接続を追加

LINQ to SQL

  • ステップ2 *-LINQ To SQLクラスファイルを追加する

LINQ to SQL

  • ステップ3 *-データベースからテーブルを選択し、新しいLINQ to SQLクラスファイルにドラッグアンドドロップします。

LINQ to SQL

  • ステップ4 *-テーブルをクラスファイルに追加しました。

LINQ to SQL

LINQ to SQLを使用したクエリ

LINQ to SQLを使用してクエリを実行するためのルールは、標準のLINQクエリのルールと同様です。 クエリは遅延または即時に実行されます。 LINQ to SQLを使用したクエリの実行で役割を果たすさまざまなコンポーネントがありますが、これらは次のコンポーネントです。

  • LINQ to SQL API -アプリケーションに代わってクエリの実行を要求し、LINQ to SQL Providerに送信します。
  • LINQ to SQL Provider -クエリをTransact SQL(T-SQL)に変換し、新しいクエリをADO Providerに送信して実行します。
  • * ADOプロバイダー*-クエリの実行後、DataReaderの形式で結果をLINQ to SQLプロバイダーに送信し、SQLプロバイダーはそれをユーザーオブジェクトの形式に変換します。

LINQ to SQLクエリを実行する前に、DataContextクラスを介してデータソースに接続することが重要です。

LINQ To SQLを使用した挿入、更新、削除

追加または挿入

C#

using System;
using System.Linq;

namespace LINQtoSQL {
   class LinqToSQLCRUD {
      static void Main(string[] args) {

         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         LinqToSQLDataContext db = new LinqToSQLDataContext(connectString);

        //Create new Employee

         Employee newEmployee = new Employee();
         newEmployee.Name = "Michael";
         newEmployee.Email = "[email protected]";
         newEmployee.ContactNo = "343434343";
         newEmployee.DepartmentId = 3;
         newEmployee.Address = "Michael - USA";

        //Add new Employee to database
         db.Employees.InsertOnSubmit(newEmployee);

        //Save changes to Database.
         db.SubmitChanges();

        //Get new Inserted Employee
         Employee insertedEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("Michael"));

         Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}, Address = {4}",
                          insertedEmployee.EmployeeId, insertedEmployee.Name, insertedEmployee.Email,
                          insertedEmployee.ContactNo, insertedEmployee.Address);

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Module Module1

   Sub Main()

      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim db As New LinqToSQLDataContext(connectString)

      Dim newEmployee As New Employee()

      newEmployee.Name = "Michael"
      newEmployee.Email = "[email protected]"
      newEmployee.ContactNo = "343434343"
      newEmployee.DepartmentId = 3
      newEmployee.Address = "Michael - USA"

      db.Employees.InsertOnSubmit(newEmployee)

      db.SubmitChanges()

      Dim insertedEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("Michael"))

      Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3},
         Address = {4}", insertedEmployee.EmployeeId, insertedEmployee.Name,
         insertedEmployee.Email, insertedEmployee.ContactNo, insertedEmployee.Address)

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()

   End Sub

End Module

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

Emplyee ID = 4, Name = Michael, Email = [email protected], ContactNo =
343434343, Address = Michael - USA

Press any key to continue.

更新

C#

using System;
using System.Linq;

namespace LINQtoSQL {
   class LinqToSQLCRUD {
      static void Main(string[] args) {

         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         LinqToSQLDataContext db = new LinqToSQLDataContext(connectString);

        //Get Employee for update
         Employee employee = db.Employees.FirstOrDefault(e =>e.Name.Equals("Michael"));

         employee.Name = "George Michael";
         employee.Email = "[email protected]";
         employee.ContactNo = "99999999";
         employee.DepartmentId = 2;
         employee.Address = "Michael George - UK";

        //Save changes to Database.
         db.SubmitChanges();

        //Get Updated Employee
         Employee updatedEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("George Michael"));

         Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}, Address = {4}",
                          updatedEmployee.EmployeeId, updatedEmployee.Name, updatedEmployee.Email,
                          updatedEmployee.ContactNo, updatedEmployee.Address);

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Module Module1

   Sub Main()

      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim db As New LinqToSQLDataContext(connectString)

      Dim employee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("Michael"))

      employee.Name = "George Michael"
      employee.Email = "[email protected]"
      employee.ContactNo = "99999999"
      employee.DepartmentId = 2
      employee.Address = "Michael George - UK"

      db.SubmitChanges()

      Dim updatedEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("George Michael"))

      Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3},
         Address = {4}", updatedEmployee.EmployeeId, updatedEmployee.Name,
         updatedEmployee.Email, updatedEmployee.ContactNo, updatedEmployee.Address)

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()

   End Sub

End Module

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

Emplyee ID = 4, Name = George Michael, Email = [email protected], ContactNo =
999999999, Address = Michael George - UK

Press any key to continue.

削除する

C#

using System;
using System.Linq;

namespace LINQtoSQL {
   class LinqToSQLCRUD {
      static void Main(string[] args) {

         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         LinqToSQLDataContext db = newLinqToSQLDataContext(connectString);

        //Get Employee to Delete
         Employee deleteEmployee = db.Employees.FirstOrDefault(e ⇒e.Name.Equals("George Michael"));

        //Delete Employee
         db.Employees.DeleteOnSubmit(deleteEmployee);

        //Save changes to Database.
         db.SubmitChanges();

        //Get All Employee from Database
         var employeeList = db.Employees;
         foreach (Employee employee in employeeList) {
            Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}",
               employee.EmployeeId, employee.Name, employee.Email, employee.ContactNo);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Module Module1

   Sub Main()

      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim db As New LinqToSQLDataContext(connectString)

      Dim deleteEmployee As Employee = db.Employees.FirstOrDefault(Function(e) e.Name.Equals("George Michael"))

      db.Employees.DeleteOnSubmit(deleteEmployee)

      db.SubmitChanges()

      Dim employeeList = db.Employees

      For Each employee As Employee In employeeList
         Console.WriteLine("Employee Id = {0} , Name = {1}, Email = {2}, ContactNo = {3}",
            employee.EmployeeId, employee.Name, employee.Email, employee.ContactNo)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
   End Sub

End Module

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

Emplyee ID = 1, Name = William, Email = [email protected], ContactNo = 999999999
Emplyee ID = 2, Name = Miley, Email = [email protected], ContactNo = 999999999
Emplyee ID = 3, Name = Benjamin, Email = [email protected], ContactNo =

Press any key to continue.

LINQ-オブジェクト

LINQ to Objectsは、LINQ to SQLまたはLINQ to XMLの場合のように、LINQプロバイダー(API)を必要とせずにインメモリデータコレクションにアクセスするためのIEnumerable <T>をサポートするLINQクエリの使用を提供します。

オブジェクトへのLINQの紹介

LINQ to Objectsのクエリは、通常IEnumerable <T>型の変数のみを返します。 要するに、LINQ to Objectsは、以前のようにコレクションに新しいアプローチを提供します。コレクションからデータを取得するための長いコーディング(非常に複雑な各ループ)を書くことが不可欠でした。取得する必要があります。

また、LINQ to Objectsには、読みやすさ、強力なフィルタリング、グループ化機能、最小限のアプリケーションコーディングでの強化された順序付けなど、従来のforeachループよりも多くの利点があります。 このようなLINQクエリは本質的にコンパクトであり、変更を加えずに、または少し変更するだけで、他のデータソースに移植できます。

以下はオブジェクトの簡単なLINQの例です-

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

namespace LINQtoObjects {
   class Program {
      static void Main(string[] args) {

         string[] tools = { "Tablesaw", "Bandsaw", "Planer", "Jointer", "Drill", "Sander" };
         var list = from t in tools select t;

         StringBuilder sb = new StringBuilder();

         foreach (string s in list) {
            sb.Append(s + Environment.NewLine);
         }

         Console.WriteLine(sb.ToString(), "Tools");
         Console.ReadLine();
      }
   }
}

この例では、文字列の配列(ツール)が、LINQ to Objectsを使用してクエリされるオブジェクトのコレクションとして使用されます。

Objects query is:
var list = from t in tools select t;

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

Tablesaw
Bandsaw
Planer
Jointer
Drill
Sander

LINQ to Objectsを使用したメモリコレクションでのクエリ

C#

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

namespace LINQtoObjects {
   class Department {
      public int DepartmentId { get; set; }
      public string Name { get; set; }
   }

   class LinqToObjects {
      static void Main(string[] args) {

         List<Department> departments = new List<Department>();

         departments.Add(new Department { DepartmentId = 1, Name = "Account" });
         departments.Add(new Department { DepartmentId = 2, Name = "Sales" });
         departments.Add(new Department { DepartmentId = 3, Name = "Marketing" });

         var departmentList = from d in departments
                              select d;

         foreach (var dept in departmentList) {
            Console.WriteLine("Department Id = {0} , Department Name = {1}",
               dept.DepartmentId, dept.Name);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Collections.Generic
Imports System.Linq

Module Module1

   Sub Main(ByVal args As String())

      Dim account As New Department With {.Name = "Account", .DepartmentId = 1}
      Dim sales As New Department With {.Name = "Sales", .DepartmentId = 2}
      Dim marketing As New Department With {.Name = "Marketing", .DepartmentId = 3}

      Dim departments As New System.Collections.Generic.List(Of Department)(New Department() {account, sales, marketing})

      Dim departmentList = From d In departments

      For Each dept In departmentList
         Console.WriteLine("Department Id = {0} , Department Name = {1}", dept.DepartmentId, dept.Name)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
   End Sub

   Class Department
      Public Property Name As String
      Public Property DepartmentId As Integer
   End Class

End Module

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

Department Id = 1, Department Name = Account
Department Id = 2, Department Name = Sales
Department Id = 3, Department Name = Marketing

Press any key to continue.

LINQ-データセット

データセットは、メモリ内で非常に有用なデータ表現を提供し、さまざまなデータベースのアプリケーションに使用されます。 LINQ to ADO.NETのテクノロジーの1つとしてのLINQ to Datasetは、データセットのデータに対するクエリの実行を容易にし、生産性を向上させます。

LINQ To Datasetの紹介

LINQ to Datasetは、開発者にとってクエリのタスクを簡単にしました。 特定のクエリ言語でクエリを作成する必要はありませんが、プログラミング言語で作成することもできます。 LINQ to Datasetは、複数のデータソースからデータが統合されている場所のクエリにも使用できます。 また、メモリコレクション内のデータにアクセスするために、LINQ to SQLやLINQ to XMLのようなLINQプロバイダーも必要ありません。

以下は、データソースが最初に取得され、次にデータセットが2つのデータテーブルで満たされるLINQ to Datasetクエリの簡単な例です。 両方のテーブル間に関係が確立され、結合句によって両方のテーブルに対してLINQクエリが作成されます。 最後に、foreachループを使用して、目的の結果を表示します。

C#

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LINQtoDataset {
   class Program {
      static void Main(string[] args) {

         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         string sqlSelect = "SELECT *FROM Department;" + "SELECT* FROM Employee;";

        //Create the data adapter to retrieve data from the database
         SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connectString);

        //Create table mappings
         da.TableMappings.Add("Table", "Department");
         da.TableMappings.Add("Table1", "Employee");

        //Create and fill the DataSet
         DataSet ds = new DataSet();
         da.Fill(ds);

         DataRelation dr = ds.Relations.Add("FK_Employee_Department",
                           ds.Tables["Department"].Columns["DepartmentId"],
                           ds.Tables["Employee"].Columns["DepartmentId"]);

         DataTable department = ds.Tables["Department"];
         DataTable employee = ds.Tables["Employee"];

         var query = from d in department.AsEnumerable()
                     join e in employee.AsEnumerable()
                     on d.Field<int>("DepartmentId") equals
                     e.Field<int>("DepartmentId")
                     select new {
                        EmployeeId = e.Field<int>("EmployeeId"),
                        Name = e.Field<string>("Name"),
                        DepartmentId = d.Field<int>("DepartmentId"),
                        DepartmentName = d.Field<string>("Name")
                     };

         foreach (var q in query) {
            Console.WriteLine("Employee Id = {0} , Name = {1} , Department Name = {2}",
               q.EmployeeId, q.Name, q.DepartmentName);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Data.SqlClient
Imports System.Linq

Module LinqToDataSet

   Sub Main()

      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim sqlSelect As String = "SELECT *FROM Department;" + "SELECT* FROM Employee;"
      Dim sqlCnn As SqlConnection = New SqlConnection(connectString)
      sqlCnn.Open()

      Dim da As New SqlDataAdapter
      da.SelectCommand = New SqlCommand(sqlSelect, sqlCnn)

      da.TableMappings.Add("Table", "Department")
      da.TableMappings.Add("Table1", "Employee")

      Dim ds As New DataSet()
      da.Fill(ds)

      Dim dr As DataRelation = ds.Relations.Add("FK_Employee_Department", ds.Tables("Department").Columns("DepartmentId"), ds.Tables("Employee").Columns("DepartmentId"))

      Dim department As DataTable = ds.Tables("Department")
      Dim employee As DataTable = ds.Tables("Employee")

      Dim query = From d In department.AsEnumerable()
                  Join e In employee.AsEnumerable() On d.Field(Of Integer)("DepartmentId") Equals
                  e.Field(Of Integer)("DepartmentId")
                  Select New Person With { _
                        .EmployeeId = e.Field(Of Integer)("EmployeeId"),
                        .EmployeeName = e.Field(Of String)("Name"),
                        .DepartmentId = d.Field(Of Integer)("DepartmentId"),
                        .DepartmentName = d.Field(Of String)("Name")
                  }

      For Each e In query
         Console.WriteLine("Employee Id = {0} , Name = {1} , Department Name = {2}", e.EmployeeId, e.EmployeeName, e.DepartmentName)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()

   End Sub

   Class Person
      Public Property EmployeeId As Integer
      Public Property EmployeeName As String
      Public Property DepartmentId As Integer
      Public Property DepartmentName As String
   End Class

End Module

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

Employee Id = 1, Name = William, Department Name = Account
Employee Id = 2, Name = Benjamin, Department Name = Account
Employee Id = 3, Name = Miley, Department Name = Sales

Press any key to continue.

LinQ to Datasetを使用したデータセットのクエリ

LINQ to Datasetを使用してデータセットのクエリを開始する前に、データをDatasetにロードすることが重要です。これは、DataAdapterクラスを使用するか、LINQ to SQLを使用して行います。 LINQ to Datasetを使用したクエリの定式化は、他のLINQ対応データソースと一緒にLINQを使用してクエリを定式化することに非常に似ています。

単一テーブルクエリ

次の単一テーブルクエリでは、すべてのオンライン注文がSalesOrderHeaderTtableから収集され、注文ID、注文日、注文番号が出力として表示されます。

  • C# *
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LinqToDataset {
   class SingleTable {
      static void Main(string[] args) {

         string connectString = System.Configuration.ConfigurationManager.ConnectionStrings["LinqToSQLDBConnectionString"].ToString();

         string sqlSelect = "SELECT* FROM Department;";

        //Create the data adapter to retrieve data from the database
         SqlDataAdapter da = new SqlDataAdapter(sqlSelect, connectString);

        //Create table mappings
         da.TableMappings.Add("Table", "Department");

        //Create and fill the DataSet
         DataSet ds = new DataSet();
         da.Fill(ds);

         DataTable department = ds.Tables["Department"];

         var query = from d in department.AsEnumerable()
         select new {
            DepartmentId = d.Field<int>("DepartmentId"),
            DepartmentName = d.Field<string>("Name")
         };

         foreach (var q in query) {
            Console.WriteLine("Department Id = {0} , Name = {1}",
               q.DepartmentId, q.DepartmentName);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}
  • VB *
Imports System.Data.SqlClient
Imports System.Linq

Module LinqToDataSet

   Sub Main()

      Dim connectString As String = System.Configuration.ConfigurationManager.ConnectionStrings("LinqToSQLDBConnectionString").ToString()

      Dim sqlSelect As String = "SELECT* FROM Department;"
      Dim sqlCnn As SqlConnection = New SqlConnection(connectString)
      sqlCnn.Open()

      Dim da As New SqlDataAdapter
      da.SelectCommand = New SqlCommand(sqlSelect, sqlCnn)

      da.TableMappings.Add("Table", "Department")
      Dim ds As New DataSet()
      da.Fill(ds)

      Dim department As DataTable = ds.Tables("Department")

      Dim query = From d In department.AsEnumerable()
      Select New DepartmentDetail With {
         .DepartmentId = d.Field(Of Integer)("DepartmentId"),
            .DepartmentName = d.Field(Of String)("Name")
      }

      For Each e In query
         Console.WriteLine("Department Id = {0} , Name = {1}", e.DepartmentId, e.DepartmentName)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()
   End Sub

   Public Class DepartmentDetail
      Public Property DepartmentId As Integer
      Public Property DepartmentName As String
   End Class

End Module

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

Department Id = 1, Name = Account
Department Id = 2, Name = Sales
Department Id = 3, Name = Pre-Sales
Department Id = 4, Name = Marketing

Press any key to continue.

LINQ-XML

LINQ to XMLは、標準クエリ演算子、プログラミングインターフェイスなどのすべてのLINQ機能への簡単なアクセスを提供します。 .NETフレームワークに統合されたLINQ to XMLは、デバッグ、コンパイル時のチェック、厳密な型指定など、.NETフレームワークの機能を最大限に活用します。

LINQ to XMLの紹介

LINQ to XMLを使用している間、XMLドキュメントをメモリに読み込むのは簡単で、クエリとドキュメントの変更はより簡単です。 また、メモリ内に存在するXMLドキュメントをディスクに保存し、シリアル化することもできます。 開発者がやや複雑なXMLクエリ言語を習得する必要がなくなります。

LINQ to XMLは、System.Xml.Linq名前空間にその力を持っています。 これには、XMLを操作するために必要な19のクラスがすべてあります。 これらのクラスは次のとおりです。

  • XAttribute
  • XCData
  • XComment
  • XContainer
  • XDeclaration
  • XDocument
  • XDocumentType
  • XElement
  • XName
  • XNamespace
  • XNode
  • XNodeDocumentOrderComparer
  • XNodeEqualityComparer
  • XObject
  • XObjectChange
  • XObjectChangeEventArgs
  • XObjectEventHandler
  • XProcessingInstruction
  • XText

LINQを使用してXMLファイルを読み取る

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQtoXML {
   class ExampleOfXML {
      static void Main(string[] args) {

         string myXML = @"<Departments>
                       <Department>Account</Department>
                       <Department>Sales</Department>
                       <Department>Pre-Sales</Department>
                       <Department>Marketing</Department>
                       </Departments>";

         XDocument xdoc = new XDocument();
         xdoc = XDocument.Parse(myXML);

         var result = xdoc.Element("Departments").Descendants();

         foreach (XElement item in result) {
            Console.WriteLine("Department Name - " + item.Value);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

   Sub Main(ByVal args As String())

      Dim myXML As String = "<Departments>" & vbCr & vbLf &
                           "<Department>Account</Department>" & vbCr & vbLf &
                           "<Department>Sales</Department>" & vbCr & vbLf &
                           "<Department>Pre-Sales</Department>" & vbCr & vbLf &
                           "<Department>Marketing</Department>" & vbCr & vbLf &
                           "</Departments>"

      Dim xdoc As New XDocument()
      xdoc = XDocument.Parse(myXML)

      Dim result = xdoc.Element("Departments").Descendants()

      For Each item As XElement In result
         Console.WriteLine("Department Name - " + item.Value)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()

   End Sub

End Module

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

Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing

Press any key to continue.

新しいノードを追加

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQtoXML {
   class ExampleOfXML {
      static void Main(string[] args) {

         string myXML = @"<Departments>
                       <Department>Account</Department>
                       <Department>Sales</Department>
                       <Department>Pre-Sales</Department>
                       <Department>Marketing</Department>
                       </Departments>";

         XDocument xdoc = new XDocument();
         xdoc = XDocument.Parse(myXML);

        //Add new Element
         xdoc.Element("Departments").Add(new XElement("Department", "Finance"));

        //Add new Element at First
         xdoc.Element("Departments").AddFirst(new XElement("Department", "Support"));

         var result = xdoc.Element("Departments").Descendants();

         foreach (XElement item in result) {
            Console.WriteLine("Department Name - " + item.Value);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

   Sub Main(ByVal args As String())

      Dim myXML As String = "<Departments>" & vbCr & vbLf &
                           "<Department>Account</Department>" & vbCr & vbLf &
                           "<Department>Sales</Department>" & vbCr & vbLf &
                           "<Department>Pre-Sales</Department>" & vbCr & vbLf &
                           "<Department>Marketing</Department>" & vbCr & vbLf &
                           "</Departments>"

      Dim xdoc As New XDocument()
      xdoc = XDocument.Parse(myXML)

      xdoc.Element("Departments").Add(New XElement("Department", "Finance"))

      xdoc.Element("Departments").AddFirst(New XElement("Department", "Support"))

      Dim result = xdoc.Element("Departments").Descendants()

      For Each item As XElement In result
         Console.WriteLine("Department Name - " + item.Value)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()

   End Sub

End Module

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

Department Name - Support
Department Name - Account
Department Name - Sales
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance

Press any key to continue.

特定のノードを削除する

C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml.Linq;

namespace LINQtoXML {
   class ExampleOfXML {
      static void Main(string[] args) {

         string myXML = @"<Departments>
                       <Department>Support</Department>
                       <Department>Account</Department>
                       <Department>Sales</Department>
                       <Department>Pre-Sales</Department>
                       <Department>Marketing</Department>
                       <Department>Finance</Department>
                       </Departments>";

         XDocument xdoc = new XDocument();
         xdoc = XDocument.Parse(myXML);

        //Remove Sales Department
         xdoc.Descendants().Where(s =>s.Value == "Sales").Remove();

         var result = xdoc.Element("Departments").Descendants();

         foreach (XElement item in result) {
            Console.WriteLine("Department Name - " + item.Value);
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

VB

Imports System.Collections.Generic
Imports System.Linq
Imports System.Xml.Linq

Module Module1

   Sub Main(args As String())

      Dim myXML As String = "<Departments>" & vbCr & vbLf &
                           "<Department>Support</Department>" & vbCr & vbLf &
                           "<Department>Account</Department>" & vbCr & vbLf &
                           "<Department>Sales</Department>" & vbCr & vbLf &
                           "<Department>Pre-Sales</Department>" & vbCr & vbLf &
                           "<Department>Marketing</Department>" & vbCr & vbLf &
                           "<Department>Finance</Department>" & vbCr & vbLf &
                           "</Departments>"

      Dim xdoc As New XDocument()
      xdoc = XDocument.Parse(myXML)

      xdoc.Descendants().Where(Function(s) s.Value = "Sales").Remove()

      Dim result = xdoc.Element("Departments").Descendants()

      For Each item As XElement In result
         Console.WriteLine("Department Name - " + item.Value)
      Next

      Console.WriteLine(vbLf & "Press any key to continue.")
      Console.ReadKey()

   End Sub

End Module

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

Department Name - Support
Department Name - Account
Department Name - Pre-Sales
Department Name - Marketing
Department Name - Finance

Press any key to continue.

LINQ-エンティティ

ADO.NET Entity Frameworkの一部であるLINQ to Entitiesは、LINQ to SQLよりも柔軟性がありますが、その複雑さと主要な機能の欠如によりあまり人気がありません。 ただし、LINQ to EntitiesはOracle、MySQLなどの多数のデータプロバイダーでのデータクエリを容易にするため、SQLサーバーデータベースでのみデータクエリを許可するLINQ to SQLの制限はありません。

さらに、ユーザーがLINQ to Entitiesを介してクエリを実行するためにデータソースコントロールを利用でき、余分なコーディングを必要とせずに結果をバインドできるという意味で、ASP.Netから主要なサポートを受けています。

LINQ to Entitiesは、これらの利点のために、今日のデータベースでLINQを使用するための標準メカニズムになっています。 LINQ to Entitiesを使用して、クエリされたデータの詳細を変更し、バッチ更新を簡単にコミットすることもできます。 LINQ to Entitiesの最も興味深い事実は、SQLと同じ構文を持ち、Join、Select、OrderByなどの標準クエリ演算子の同じグループさえ持っていることです。

LINQ to Entitiesクエリの作成および実行プロセス

  • ObjectContext (エンティティ接続)からの ObjectQuery インスタンスの構築
  • 新しく構築されたインスタンスを使用して、C#またはVisual Basic(VB)でクエリを作成する
  • LINQの標準クエリ演算子とLINQ式のコマンドツリーへの変換
  • 発生した例外をクライアントに直接渡すクエリを実行する
  • すべてのクエリ結果をクライアントに返す

ここでは、 ObjectContext は、 Entity Data Model との対話を可能にする主要なクラスです。つまり、LINQをデータベースに接続するブリッジとして機能します。 ここでのコマンドツリーは、Entityフレームワークと互換性のあるクエリ表現です。

一方、Entity Frameworkは、実際には*オブジェクトリレーショナルマッパー*であり、ビジネスオブジェクトやデータベーステーブルごとのエンティティを生成し、作成、更新、削除などのさまざまな基本操作を容易にする開発者によってORMと略されます。読んで。 次の図は、エンティティフレームワークとそのコンポーネントを示しています。

LINQ-エンティティ

エンティティモデルでLINQを使用したADD、UPDATE、およびDELETEの例

以下の手順に従って、最初にエンティティモデルを追加します。

  • ステップ1 *-プロジェクトを右クリックして[新しい項目を追加]をクリックすると、以下のようにウィンドウが開きます。 ADO.NET Entity Data Modelを選択し、名前を指定して[追加]をクリックします。

LINQ-エンティティモデル

ステップ2 *-[データベースから生成]を選択します。

LINQ-エンティティモデル

  • ステップ3 *-ドロップダウンメニューから[データベース接続]を選択します。

LINQ-エンティティモデル

  • ステップ4 *-すべてのテーブルを選択します。

LINQ-エンティティモデル

次に、次のコードを記述します。

using DataAccess;
using System;
using System.Linq;

namespace LINQTOSQLConsoleApp {
   public class LinqToEntityModel {
      static void Main(string[] args) {

         using (LinqToSQLDBEntities context = new LinqToSQLDBEntities()) {
           //Get the List of Departments from Database
            var departmentList = from d in context.Departments
            select d;

            foreach (var dept in departmentList) {
               Console.WriteLine("Department Id = {0} , Department Name = {1}",
                  dept.DepartmentId, dept.Name);
            }

           //Add new Department
            DataAccess.Department department = new DataAccess.Department();
            department.Name = "Support";

            context.Departments.Add(department);
            context.SaveChanges();

            Console.WriteLine("Department Name = Support is inserted in Database");

           //Update existing Department
            DataAccess.Department updateDepartment = context.Departments.FirstOrDefault(d ⇒d.DepartmentId == 1);
            updateDepartment.Name = "Account updated";
            context.SaveChanges();

            Console.WriteLine("Department Name = Account is updated in Database");

           //Delete existing Department
            DataAccess.Department deleteDepartment = context.Departments.FirstOrDefault(d ⇒d.DepartmentId == 3);
            context.Departments.Remove(deleteDepartment);
            context.SaveChanges();

            Console.WriteLine("Department Name = Pre-Sales is deleted in Database");

           //Get the Updated List of Departments from Database
            departmentList = from d in context.Departments
            select d;

            foreach (var dept in departmentList) {
               Console.WriteLine("Department Id = {0} , Department Name = {1}",
                  dept.DepartmentId, dept.Name);
            }
         }

         Console.WriteLine("\nPress any key to continue.");
         Console.ReadKey();
      }
   }
}

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

LINQ-エンティティモデルの結果

LINQ-ラムダ式

「ラムダ式」という用語は、関数の定義に適用される数学表記法である「ラムダ」計算に由来しています。 LINQ方程式の実行可能部分としてのラムダ式は、実行時にロジックを変換して、データソースに簡単に渡すことができるようにします。 ただし、ラムダ式は、LINQでのみアプリケーションを見つけることに限定されていません。

これらの式は、次の構文で表されます-

(Input parameters) ⇒ Expression or statement block

これは、ラムダ式の例です-

y⇒y *y

上記の式はyという名前のパラメーターを指定し、yの値は2乗されます。 ただし、この形式でラムダ式を実行することはできません。 C#のラムダ式の例を以下に示します。

C#

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

namespace lambdaexample {
   class Program {

      delegate int del(int i);
      static void Main(string[] args) {

         del myDelegate = y ⇒ y* y;
         int j = myDelegate(5);
         Console.WriteLine(j);
         Console.ReadLine();
      }
   }
}

VB

Module Module1
   Private Delegate Function del(ByVal i As Integer) As Integer

   Sub Main(ByVal args As String())

      Dim myDelegate As del = Function(y) y * y
      Dim j As Integer = myDelegate(5)
      Console.WriteLine(j)
      Console.ReadLine()

   End Sub

End Module

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

25

式ラムダ

上記のラムダ式の構文の式は右側にあるため、これらは式ラムダとも呼ばれます。

非同期ラムダ

asyncキーワードを使用して非同期処理を組み込むことにより作成されるラムダ式は、非同期ラムダと呼ばれます。 以下は非同期ラムダの例です。

Func<Task<string>> getWordAsync = async()⇒ “hello”;

標準クエリ演算子のラムダ

クエリ演算子内のラムダ式は、オンデマンドで同じものによって評価され、シーケンス全体ではなく、入力シーケンスの各要素に対して継続的に機能します。 開発者は、Lambda式によって独自のロジックを標準クエリ演算子にフィードすることが許可されています。 以下の例では、開発者は「Where」演算子を使用して、ラムダ式を使用して特定のリストから奇数値を回収しています。

C#

//Get the average of the odd Fibonacci numbers in the series...

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

namespace lambdaexample {
   class Program {
      static void Main(string[] args) {

         int[] fibNum = { 1, 1, 2, 3, 5, 8, 13, 21, 34 };
         double averageValue = fibNum.Where(num ⇒ num % 2 == 1).Average();
         Console.WriteLine(averageValue);
         Console.ReadLine();
      }
   }
}

VB

Module Module1

   Sub Main()

      Dim fibNum As Integer() = {1, 1, 2, 3, 5, 8, 13, 21, 34}
      Dim averageValue As Double = fibNum.Where(Function(num) num Mod 2 = 1).Average()

      Console.WriteLine(averageValue)
      Console.ReadLine()

   End Sub

End Module

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

7.33333333333333

Lambdaの型推論

C#では、型推論はさまざまな状況で便利に使用されますが、型を明示的に指定することもありません。 ただし、ラムダ式の場合、型の推論は、コンパイラが満たされる必要があるため、各型が指定されている場合にのみ機能します。 次の例を考えてみましょう。

delegate int Transformer (int i);

ここで、コンパイラは型推論を使用して、xが整数であるという事実を利用します。これは、Transformerのパラメーターの型を調べることで行われます。

Lambda式の変数スコープ

ラムダ式内で開始される変数が外部メソッドで表示されることを意図していないなど、ラムダ式で変数スコープを使用する際にいくつかのルールがあります。 また、キャプチャされた変数は、それを参照するデリゲートがガベージコレクションの動作に適格にならない限り、ガベージコレクションされないというルールがあります。 さらに、ラムダ式内のreturnステートメントを使用して、囲んでいるメソッドを返すことを禁止するルールがあります。

以下は、ラムダ式の変数スコープを示す例です。

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

namespace lambdaexample {
   class Program {
      delegate bool D();
      delegate bool D2(int i);

      class Test {
         D del;
         D2 del2;

         public void TestMethod(int input) {
            int j = 0;
           //Initialize the delegates with lambda expressions.
           //Note access to 2 outer variables.
           //del will be invoked within this method.
            del = () ⇒ { j = 10; return j > input; };

           //del2 will be invoked after TestMethod goes out of scope.
            del2 = (x) ⇒ { return x == j; };

           //Demonstrate value of j:
           //The delegate has not been invoked yet.
            Console.WriteLine("j = {0}", j);       //Invoke the delegate.
            bool boolResult = del();

            Console.WriteLine("j = {0}. b = {1}", j, boolResult);
         }

         static void Main() {
            Test test = new Test();
            test.TestMethod(5);

           //Prove that del2 still has a copy of
           //local variable j from TestMethod.
            bool result = test.del2(10);

            Console.WriteLine(result);

            Console.ReadKey();
         }
      }
   }
}

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

j = 0
j = 10. b = True
True

式ツリー

ラムダ式は Expression Tree 構築で広範囲に使用されます。 式ツリーは、すべてのノード自体がメソッド呼び出しのような式であるか、x <yのような二項演算であるツリーに似たデータ構造のコードを提供します。 以下は、式ツリーを構築するためのラムダ式の使用例です。

ステートメントラムダ

2つまたは3つのステートメントで構成される*ステートメントラムダ*もありますが、式ツリーの構築には使用されません。 returnステートメントは、ステートメントlambdaで記述する必要があります。

ステートメントlambdaの構文

(params)⇒ {statements}

ステートメントラムダの例

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

namespace lambdaexample {
   class Program {
      static void Main(string[] args) {
         int[] source = new[] { 3, 8, 4, 6, 1, 7, 9, 2, 4, 8 };

         foreach (int i in source.Where(x ⇒
            {
               if (x <= 3)
                  return true;
               else if (x >= 7)
                  return true;
               return false;
            }
         ))
        Console.WriteLine(i);
        Console.ReadLine();
      }
   }
}

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

3
8
1
7
9
2
8

ラムダは、メソッドに基づくLINQクエリの引数として使用され、 isas のような演算子の左側に匿名メソッドのような場所を置くことは許可されません。 Lambda式は匿名メソッドによく似ていますが、これらはデリゲートとしてのみ使用されるように制限されていません。

ラムダ式を使用する際の注意点

  • ラムダ式は値を返すことができ、パラメーターを持つことができます。
  • パラメーターは、ラムダ式を使用してさまざまな方法で定義できます。
  • ラムダ式に単一のステートメントがある場合、中括弧の必要はありませんが、複数のステートメントがある場合、中括弧と戻り値は書くのに不可欠です。
  • ラムダ式では、クロージャーと呼ばれる機能により、ラムダ式ブロックの外側にある変数にアクセスできます。 問題を回避するために、クロージャーの使用は慎重に行う必要があります。
  • ラムダ式内で安全でないコードを実行することは不可能です。
  • ラムダ式は、演算子の左側で使用するためのものではありません。

LINQ-ASP.Net

NETフレームワークの拡張セットとして、LINQはASP.NET開発者によるデータアクセスの推奨メカニズムです。 ASP.NET 3.5には、LINQをASP.NETで簡単に使用できるようにするLINQDataSourceコントロールが組み込まれています。 ASP.NETは、上記のコントロールをデータソースとして使用します。 現実のプロジェクトは主にWebサイトまたはWindowsアプリケーションを含むため、ASP.NETでのLINQの概念をよりよく理解するために、LINQ機能を利用するASP.NET Webサイトの作成から始めましょう。.

このためには、システムにVisual Studioと.NETフレームワークをインストールすることが不可欠です。 Visual Studioを開いたら、ファイル→新規→Webサイトに移動します。 下の図に示すように、ポップアップウィンドウが開きます。

LINQ-ASP.Net

次に、左側のテンプレートの下に、Webサイトを作成するための2つの言語オプションがあります。 * Visual C#を選択し、 *ASP.NET Empty Web Site を選択します。

システム上の新しいWebサイトを保存するフォルダーを選択します。 OK を押すと、すぐに Solution Explorer がすべてのWebファイルを含む画面に表示されます。 ソリューションエクスプローラーでDefault.aspxを右クリックし、ブラウザーで表示を選択して、ブラウザーでデフォルトのASP.NET Webサイトを表示します。 次のスクリーンショットに示すように、すぐに新しいASP.NET WebサイトがWebブラウザーで開きます。

LINQ-ASP.Net

LINQDataSourceコントロール

aspx is in fact the major file extension used in ASP.NET websites. Visual Studio by default creates all the necessary pages for a basic website like Home page *and About Us* page where you can place your content conveniently. The code for the website is generated automatically here and can be viewed too..

LINQDataSourceコントロールを使用して、ASP.NET Webサイトのページのデータを*更新、挿入*および*削除*することができます。 LINQDataSourceコントロールはそのような操作のために動的に作成されたコマンドを使用するため、SQLコマンドを指定する必要はまったくありません。

このコントロールにより、ユーザーはマークアップテキストのプロパティ設定により、ASP.NET WebページでLINQを便利に使用できます。 LINQDataSourceは、 SqlDataSourceObjectDataSource などのコントロールと非常によく似ています。ページにある他のASP.NETコントロールをデータソースにバインドする際に使用できます。 そのため、LINQDataSourceコントロールによって呼び出されるさまざまな機能を説明するための*データベース*が必要です。

ASP.NET Webページフォームでのコントロールの使用法の説明を始める前に、Microsoft Visual Studioツールボックスを開き、下図のようにASP.NET Webサイトの.aspxページにLINQDataSourceコントロールをドラッグアンドドロップすることが不可欠です。

LINQ-ASP.Net

次の手順では、従業員レコードのすべての列を選択して、LINQDataSourceを構成します。

LINQ-ASP.Net

次に、GridViewコントロールを.aspxページに追加し、次の図に示すように構成します。 GridViewコントロールは強力で、データを操作する柔軟性を提供します。 コントロールを設定するとすぐに、ブラウザに表示されます。

LINQ-ASP.Net

aspxページの画面に表示できるコーディングは次のようになります-.

<!DOCTYPE html>

<html>
   <head runat = "server">
      <title></title>
   </head>

   <body>
      <form id = "form1" runat = "server">
         <div>
            <asp:GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False"

               DataKeyNames = "ContactID" DataSourceID = "LINQDataSource1">
               <Columns>

                  <asp:BoundField DataField = "ContactID" HeaderText = "ContactID"
                     InsertVisible = "False" ReadOnly="True" SortExpression = "ContactID"/>
                  <asp:CheckBoxField DataField = "NameStyle" HeaderText = "NameStyle"
                     SortExpression = "NameStyle"/>
                  <asp:BoundField DataField = "Title" HeaderText = "Title" SortExpression = "Title"/>
                  <asp:BoundField DataField = "FirstName" HeaderText = "FirstName"
                     SortExpression="FirstName"/>
                  <asp:BoundField DataField = "MiddleName" HeaderText = "MiddleName"
                     SortExpression = "MiddleName"/>
                  <asp:BoundField DataField = "LastName" HeaderText = "LastName"
                     SortExpression = "LastName"/>
                  <asp:BoundField DataField = "Suffix" HeaderText = "Suffix"
                     SortExpression = "Suffix"/>
                  <asp:BoundField DataField = "EmailAddress" HeaderText = "EmailAddress"
                     SortExpression = "EmailAddress"/>
               </Columns>

            </asp:GridView>

            <br/>

         </div>

         <asp:LINQDataSource ID = "LINQDataSource1" runat = "server"

            ContextTypeName = "LINQWebApp1.AdventureWorksDataContext" EntityTypeName = ""
               TableName = "Contacts">

         </asp:LINQDataSource>
      </form>
   </body>
</html>

ここで、プロパティContextTypeNameをデータベースを表すクラスのプロパティに設定することが重要であることに注意してください。 たとえば、ここではLINQWebApp1.AdventureWorksDataContextとして指定されています。このアクションにより、LINQDataSourceとデータベースの間に必要な接続が確立されるためです。

LINQを使用したASP.NETページでのデータの挿入、更新、削除

上記のすべてのステップを厳密に完了した後、 LINQDataSource Control から LINQDataSource Tasks を選択し、次のスクリーンショットに示すように、挿入を有効にし、更新を有効にし、同じから削除を有効にする3つのボックスをすべて選択します。

LINQ-ASP.Net

すぐに、宣言型マークアップが次のように画面に表示されます。

<asp:LINQDataSource
   ContextTypeName = "LINQWebApp1.AdventureWorksDataContext"
   TableName = "Contacts"
   EnableUpdate = "true"
   EnableInsert = "true"
   EnableDelete = "true"
   ID = "LINQDataSource1"
   runat = "server">
</asp:LINQDataSource>

複数の行と列があるので、グリッドの選択された行の詳細のみを表示するために、グリッドビューコントロールの下に詳細ビューまたはマスターコントロールという名前の別のコントロールを.aspxフォームに追加することをお勧めします。 詳細ビューコントロールから詳細ビュータスクを選択し、以下に示すようにチェックボックスをオンにします。

LINQ-ASP.Net

次に、変更を保存し、Ctrl + F5キーを押してブラウザーでページを表示します。ここで、詳細ビューコントロールのレコードを削除、更新、挿入できます。