Asp.net-linq

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

ASP.NET-LINQ

ほとんどのアプリケーションはデータ中心ですが、ほとんどのデータリポジトリはリレーショナルデータベースです。 長年にわたり、設計者と開発者はオブジェクトモデルに基づいてアプリケーションを設計してきました。

オブジェクトは、データアクセス層(DAL)と呼ばれるデータアクセスコンポーネントへの接続を担当します。 ここで、考慮すべき3つのポイントがあります。

  • アプリケーションに必要なすべてのデータが同じソースに保存されるわけではありません。 ソースは、関係データベース、何らかのビジネスオブジェクト、XMLファイル、またはWebサービスです。
  • インメモリオブジェクトへのアクセスは、データベースまたはXMLファイルのデータにアクセスするよりも簡単で安価です。
  • アクセスされるデータは直接使用されませんが、ソート、順序付け、グループ化、変更などが必要です。

したがって、さまざまなデータソースからのデータを結合し、数行のコードで標準のデータ処理操作を実行できる、あらゆる種類のデータアクセスを容易にするツールが1つあれば、非常に役立ちます。

LINQまたはLanguage-Integrated Queryはそのようなツールです。 LINQは、クエリをオブジェクトとして設定する.Net Framework 3.5およびそのマネージ言語の拡張機能のセットです。 共通言語を使用してさまざまなタイプのデータを照会するための共通構文とプログラミングモデルを定義します。

Select、Project、Join、Group、Partition、Set操作などの関係演算子はLINQに実装され、.Net framework 3.5のC#およびVBコンパイラはLINQ構文をサポートし、構成されたデータを操作できるようにしますADO.NETに頼らずに保存します。

たとえば、C#でLINQクエリを使用して、NorthwindデータベースのCustomersテーブルをクエリすると、コードは次のようになります。

var data = from c in dataContext.Customers
where c.Country == "Spain"
select c;

どこで:

  • 「from」キーワードは、コレクションのコンテンツを論理的にループします。
  • 「where」キーワードを含む式は、コレクション内の各オブジェクトに対して評価されます。
  • 「select」ステートメントは、評価されるオブジェクトを選択して、返されるリストに追加します。 *'var’キーワードは変数宣言用です。 返されたオブジェクトの正確なタイプは不明であるため、情報が動的に推測されることを示しています。

LINQクエリは、IEnumerable <T>から継承する任意のデータ保持クラスに適用できます。ここで、TはList <Book>などの任意のデータ型です。

概念を理解するために例を見てみましょう。 この例では、次のクラスを使用します。Books.cs

public class Books
{
   public string ID {get; set;}
   public string Title { get; set; }
   public decimal Price { get; set; }
   public DateTime DateOfRelease { get; set; }

   public static List<Books> GetBooks()
   {
      List<Books> list = new List<Books>();
      list.Add(new Books { ID = "001",
         Title = "Programming in C#",
         Price = 634.76m,
         DateOfRelease = Convert.ToDateTime("2010-02-05") });

      list.Add(new Books { ID = "002",
         Title = "Learn Java in 30 days",
         Price = 250.76m,
         DateOfRelease = Convert.ToDateTime("2011-08-15") });

      list.Add(new Books { ID = "003",
         Title = "Programming in ASP.Net 4.0",
         Price = 700.00m,
         DateOfRelease = Convert.ToDateTime("2011-02-05") });

      list.Add(new Books { ID = "004",
         Title = "VB.Net Made Easy",
         Price = 500.99m,
         DateOfRelease = Convert.ToDateTime("2011-12-31") });

      list.Add(new Books { ID = "005",
         Title = "Programming in C",
         Price = 314.76m,
         DateOfRelease = Convert.ToDateTime("2010-02-05") });

      list.Add(new Books { ID = "006",
         Title = "Programming in C++",
         Price = 456.76m,
         DateOfRelease = Convert.ToDateTime("2010-02-05") });

      list.Add(new Books { ID = "007",
         Title = "Datebase Developement",
         Price = 1000.76m,
         DateOfRelease = Convert.ToDateTime("2010-02-05") });

      return list;
   }
}

このクラスを使用する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();
      var booktitles = from b in books select b.Title;

      foreach (var title in booktitles)
         lblbooks.Text += String.Format("{0} <br/>", title);
   }
}

ページが実行されると、ラベルにクエリの結果が表示されます。

LINQ結果

上記のLINQ式:

var booktitles =
from b in books
select b.Title;

次のSQLクエリと同等です。

SELECT Title from Books

LINQオペレーター

これまでに使用された演算子とは別に、すべてのクエリ句を実装する他の演算子がいくつかあります。 いくつかの演算子と節を見てみましょう。

結合句

SQLの「結合句」は、2つのデータテーブルを結合するために使用され、両方のテーブルの列を含むデータセットを表示します。 LINQもそれが可能です。 これを確認するには、前のプロジェクトにSaledetails.csという名前の別のクラスを追加します。

public class Salesdetails
{
   public int sales { get; set; }
   public int pages { get; set; }
   public string ID {get; set;}

   public static IEnumerable<Salesdetails> getsalesdetails()
   {
      Salesdetails[] sd =
      {
         new Salesdetails { ID = "001", pages=678, sales = 110000},
         new Salesdetails { ID = "002", pages=789, sales = 60000},
         new Salesdetails { ID = "003", pages=456, sales = 40000},
         new Salesdetails { ID = "004", pages=900, sales = 80000},
         new Salesdetails { ID = "005", pages=456, sales = 90000},
         new Salesdetails { ID = "006", pages=870, sales = 50000},
         new Salesdetails { ID = "007", pages=675, sales = 40000},
      };

      return sd.OfType<Salesdetails>();
   }
}

Page_Loadイベントハンドラーにコードを追加して、join句を使用して両方のテーブルでクエリを実行します。

protected void Page_Load(object sender, EventArgs e)
{
   IEnumerable<Books> books = Books.GetBooks();
   IEnumerable<Salesdetails> sales = Salesdetails.getsalesdetails();

   var booktitles = from b in books join s in sales on b.ID equals s.ID
      select new { Name = b.Title, Pages = s.pages };

   foreach (var title in booktitles)
      lblbooks.Text += String.Format("{0} <br/>", title);
}

結果のページは次のとおりです。

LINQ Result2

Where句

「where句」を使用すると、クエリにいくつかの条件フィルターを追加できます。 たとえば、ページ数が500を超える本を表示する場合は、Page_Loadイベントハンドラーを次のように変更します。

var booktitles = from b in books join s in sales on b.ID equals s.ID
   where s.pages > 500 select new { Name = b.Title, Pages = s.pages };

クエリは、ページ数が500を超える行のみを返します。

LINQ Result3

OrderbyおよびOrde​​rbydescending句

これらの句により、クエリ結果をソートできます。 書籍のタイトル、ページ数、価格を価格でソートするには、Page_Loadイベントハンドラーで次のコードを記述します。

var booktitles = from b in books join s in sales on b.ID equals s.ID
   orderby b.Price select new { Name = b.Title,  Pages = s.pages, Price = b.Price};

返されるタプルは次のとおりです。

LINQ Result4

Let句

let句を使用すると、変数を定義し、データ値から計算された値を割り当てることができます。 たとえば、上記の2つの売上から合計売上を計算するには、以下を計算する必要があります。

TotalSale = Price of the Book* Sales

これを実現するには、次のコードスニペットをPage_Loadイベントハンドラーに追加します。

let句を使用すると、変数を定義し、データ値から計算された値を割り当てることができます。 たとえば、上記の2つの売上から合計売上を計算するには、以下を計算する必要があります。

var booktitles = from b in book join s in sales on b.ID equals s.ID
   let totalprofit = (b.Price * s.sales)
   select new { Name = b.Title, TotalSale = totalprofit};

結果のクエリページは次のようになります。

LINQ Result5