ほとんどのアプリケーションはデータ中心ですが、ほとんどのデータ ウェアハウスはリレーショナル データベースです。長年にわたり、デザイナーと開発者はオブジェクト モデルに基づいてアプリケーションを設計してきました。
オブジェクトは、データ アクセス層 (DAL) と呼ばれる、データにアクセスするコンポーネントを接続する役割を果たします。ここで次の 3 つの点を考慮する必要があります。
アプリケーションに必要なすべてのデータを単一のリソースに保存する必要はありません。このリソースには、リレーショナル データベース、ビジネス オブジェクト、XML ファイル、または WEB サーバーを指定できます。
メモリ内のオブジェクトへのアクセスは、データベースや XML ファイル内のデータにアクセスするよりも簡単で低コストです。
アクセスされたデータは直接使用されませんが、ダンプ、並べ替え、グループ化、変更などが行われます。
したがって、わずか数行のコードであらゆる種類のデータを簡単に統合できるツール、つまりさまざまなソースからのデータを統合し、基本的なデータ操作を実行できるツールがあれば、非常に便利です。
統合言語クエリ (LINQ) はそのようなツールの 1 つです。 LINQ は .NET Framework 3.5 の拡張機能であり、その管理言語によりクエリがオブジェクトに似たものになります。これは、慣用的な構文を使用してさまざまな種類のデータの検索を完了できるようにする共通の構文とプログラム モデルを定義します。
検索、プロジェクト、リンク、グループ、パーティション、設定操作などの関連操作を LINQ で使用でき、.NET Framework 3.5 の C# および VB コンパイラーは LINQ 構文をサポートしているため、 ADO.NET。
たとえば、C# の LINQ を使用して Northwind データベースの Consumers テーブルにクエリを実行するには、コードは次のようになります。
var data = from c in dataContext.Customerswhere c. Country == "スペイン"select c;
で:
from キーワードは論理的に各コレクションを順番に通過します。
where キーワードを含む式は、コレクション内の各オブジェクトを比較します。
select ステートメントは、比較されるオブジェクトを選択し、リストに追加して返します。
キーワード var は変数宣言に使用されます。返されるオブジェクトの正確なタイプは不明であるため、情報を動的に推論する必要があることを示しています。
LINQ クエリ ステートメントは、IEnumerable を継承する任意のデータ サポート クラスに適用できます。T には List<Book> などの任意のデータ型を指定できます。
概念を理解するために例を見てみましょう。この例では次のクラスが使用されています: Book.cs
public class Books{ public string ID {get; set;} public string Title { get; set; public DateTime DateOfRelease { get; List<Books> list = new List<Books>(); list.Add(new Books { ID = "001", タイトル = "C# プログラミング", 価格 = 634.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "002", Title = "30 日で Java を学ぶ", Price = 250.76m, DateOfRelease = Convert.ToDateTime ("2011-08-15") }); list.Add(新しい書籍 { ID = "003"、タイトル = "ASP.Net 4.0 のプログラミング"、価格 = 700.00m、DateOfRelease = Convert.ToDateTime("2011-02-05") }); list.Add(new Books { ID = "004",タイトル = "VB.Net Made Easy"、価格 = 500.99 百万、リリース日 = Convert.ToDateTime("2011-12-31") }); list.Add(new Books { ID = "005", タイトル = "C によるプログラミング", 価格 = 314.76m, DateOfRelease = Convert.ToDateTime("2010- 02-05") }); list.Add(new Books { ID = "006", Title = "プログラミングでC++", 価格 = 456.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") }); list.Add(new Books { ID = "007", タイトル = "データベース開発", 価格 = 1000.76m, DateOfRelease = Convert.ToDateTime("2010-02-05") });リスト; }}
Web ページでこのクラスを使用して、本のタイトルを表示する単純なラベル コントロールを作成します。 Page_Load メソッドは書籍のリストを作成し、LINQ クエリを使用してタイトルを返します。
public Partial class simplequery : System.Web.UI.Page{ protected void Page_Load(object sender, EventArgs e) { List<Books> Books = Books.GetBooks(); from b in Books select b.Title ( var title in booktitles) lblbooks.Text += String.Format("{0} <br />", title);
Web ページが実行されると、タグによってクエリ結果が表示されます。
上記の LINQ 式は次のとおりです。
var booktitles = 書籍の b から b.Title を選択します。
次の SQL ステートメントと同等です。
本からタイトルを選択
これまでに使用した演算子に加えて、クエリ句を実行するための演算子が他にも多数あります。いくつかの演算子と句を見てみましょう。
SQL の「結合句」は、2 つのデータ テーブルを結合し、両方のデータ テーブルにある列のデータのコレクションを表示するために使用されます。 LINQ もこの機能をサポートできます。これを確認するには、Saledetails.cs という名前の別のクラスを前のプロジェクトに追加します。
public class Salesdetails{ public int sales { get; } public int Pages {get; set;} public static IEnumerable<Salesdetails> getsalesdetails() { new Salesdetails { ID = "001"、ページ = 678、売上 = 110000}、新しい売上詳細 { ID = "002"、ページ = 789、販売 = 60000}、新しい販売詳細 { ID = "003"、ページ = 456、販売 = 40000}、新しい販売詳細 { ID = "004"、ページ = 900、販売 = 80000}、新しい販売詳細 { ID = "005"、ページ = 456、売上 = 90000}、新しい売上詳細 { ID = "006"、ページ = 870、売上 = 50000}、新しい売上詳細 { ID = "007"、ページ = 675、売上 = 40000}、}; return sd.OfType<Salesdetails>();
Page_Load 関数にコードを追加して、結合句処理を使用して 2 つのテーブルに対するクエリを完了します。
protected void Page_Load(object sender, EventArgs e){ IEnumerable<Books> Books = Books.GetBooks() IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails(); 書籍の b から b.ID の販売に s を結合します。 s.ID と等しい select new { Name = b.Title, Pages = s.pages }; booktitles) lblbooks.Text += String.Format("{0} <br />", title);}
結果ページは次のように表示されます。
where 句を使用すると、フィルタリング条件をクエリに追加できます。たとえば、500 ページを超える参考文献を取得したい場合は、Page_Load メソッドのハンドルを次のように変更できます。
var booktitles = from b in Books join s in sales on b.ID = s.ID where s.pages > 500 select new { Name = b.Title, Pages = s.pages };
クエリ ステートメントは、ページ数が 500 を超える列のみを返します。
これらの句を使用すると、クエリ結果を並べ替えることができます。タイトル、ページ番号、本の価格をクエリし、価格順に並べ替えるには、Page_Load メソッドのハンドルに次のコードを記述します。
var booktitles = from b in Books join s in sales on b.ID 等しい s.ID orderby b.Price select new { Name = b.Title, Pages = s.pages, Price = b.Price};
返されるタプルは次のとおりです。
let 句を使用すると、変数を定義し、データから計算された値を変数に割り当てることができます。たとえば、上記の 2 つの売上高から合計売上高を計算するには、次のように計算する必要があります。
TotalSale = 本の価格 * 売上高
この方程式を完成させるには、次のコード スニペットを Page_Load メソッドのハンドルに追加します。
let 句を使用すると、変数を定義し、データから計算された値を変数に割り当てることができます。たとえば、上記の 2 つの売上高から合計売上高を計算するには、次のように計算する必要があります。
var booktitles = from b in book join s in sales on b.ID = s.ID let totalprofit = (b.Price * s.sales) select new { Name = b.Title, TotalSale = totalprofit};
クエリ結果は以下のようになります。