マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

統合言語クエリ (LINQ: Language-Integrated Query)

構文

クエリは、

  • クエリ式の構文
  • メソッド ベースのクエリ構文

という 2 とおりの構文を使って作成できる。

クエリ式の構文

メソッド ベースのクエリ構文

LINQ to Objects

http://msdn.microsoft.com/ja-jp/library/vstudio/bb397919.aspx

匿名型配列 + クエリ式の構文例

匿名型配列

var AnonymousType = new[]{ 
   new { 年度=2013, 種別=14, 生年度=1979,平均人員=200,支給年金額=120000}, 
   new { 年度=2012, 種別=15, 生年度=1980,平均人員=120,支給年金額=65000}, 
   new { 年度=2012, 種別=21, 生年度=1981,平均人員=25,支給年金額=23000}, 
   new { 年度=2010, 種別=43, 生年度=1982,平均人員=12,支給年金額=12000}, 
   new { 年度=2012, 種別=21, 生年度=1981,平均人員=25,支給年金額=23000}
};
 

クエリ式の構文例

Console.WriteLine("匿名型配列 + クエリ式の構文例");
Console.WriteLine("--------------------------------------------------");

var query1 = from p in AnonymousType
          where p.年度 == 2012
          select new {
   p.年度,
   p.種別,
   p.生年度,
   平均人員2 = p.平均人員 / 12,
   p.支給年金額
          };

foreach (var item in query1)
{
    Console.WriteLine("年度={0}, 種別={1}, 生年度={2}, 平均人員2={3}, 支給年金額={4}", 
        item.年度, item.種別, item.生年度, item.平均人員2, item.支給年金額);
}

クラス(POCO) + クエリ式の構文例

クラス(POCO)

   class BeanClass
   {
       public int 年度;
       public int 種別;
       public int 生年度;
       public int 平均人員2;
       public int 支給年金額;
   }

クエリ式の構文例

Console.WriteLine("匿名型配列 + クエリ式の構文例(クラス指定)");
Console.WriteLine("--------------------------------------------------");

var query2 = from p in AnonymousType
  where p.年度 == 2012
  select new BeanClass
  {
      年度 = p.年度,
      種別 = p.種別,
      生年度 = p.生年度,
      平均人員2 = p.平均人員 / 12,
      支給年金額 = p.支給年金額
  };

foreach (var item in query2)
{
    Console.WriteLine("年度={0}, 種別={1}, 生年度={2}, 平均人員2={3}, 支給年金額={4}",
        item.年度, item.種別, item.生年度, item.平均人員2, item.支給年金額);
}

Console.WriteLine("--------------------------------------------------");
Console.ReadKey();

メソッド ベースのクエリ構文例 + GroupBy?

Console.WriteLine("匿名型配列 + メソッド ベースのクエリ構文例 + GroupBy");
Console.WriteLine("--------------------------------------------------");

// 参考
var query8 = AnonymousType
    .Where(p => p.年度 == 2012)
    .GroupBy(p => new { p.年度, p.種別 })
    .Select(p => new
    {
        年度 = p.Key.年度,
        種別 = p.Key.種別,
        平均人員2合計 = p.Sum(x => x.平均人員) / 12,
        支給年金額合計 = p.Sum(x => x.支給年金額)
    });

foreach (var item in query8)
{
    Console.WriteLine("年度={0}, 種別={1}, 平均人員2合計={2}, 支給年金額合計={3}",
        item.年度, item.種別, item.平均人員2合計, item.支給年金額合計);
}

インデクサList + クエリ式の構文例

インデクサList

List<DataRow> RowList = new List<DataRow>();

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("年度", typeof(int)));
dt.Columns.Add(new DataColumn("種別", typeof(int)));
dt.Columns.Add(new DataColumn("生年度", typeof(int)));
dt.Columns.Add(new DataColumn("平均人員", typeof(int)));
dt.Columns.Add(new DataColumn("支給年金額", typeof(int)));

dr = dt.NewRow();

dr["年度"] = 2013;
dr["種別"] = 14;
dr["生年度"] = 1979;
dr["平均人員"] = 200;
dr["支給年金額"] = 120000;

RowList.Add(dr);

dr = dt.NewRow();

dr["年度"] = 2012;
dr["種別"] = 15;
dr["生年度"] = 1980;
dr["平均人員"] = 120;
dr["支給年金額"] = 65000;

RowList.Add(dr);

dr = dt.NewRow();

dr["年度"] = 2012;
dr["種別"] = 21;
dr["生年度"] = 1981;
dr["平均人員"] = 25;
dr["支給年金額"] = 23000;

RowList.Add(dr);

dr = dt.NewRow();

dr["年度"] = 2010;
dr["種別"] = 43;
dr["生年度"] = 1982;
dr["平均人員"] = 12;
dr["支給年金額"] = 12000;

RowList.Add(dr);

dr = dt.NewRow();

dr["年度"] = 2012;
dr["種別"] = 21;
dr["生年度"] = 1981;
dr["平均人員"] = 25;
dr["支給年金額"] = 23000;

RowList.Add(dr);

クエリ式の構文例

Console.WriteLine("List<DataRow> + クエリ式の構文例");
Console.WriteLine("--------------------------------------------------");

var query4 = from p in RowList
    where p.Field<int>("年度") == 2012
    select new
    {
        年度 = p.Field<int>("年度"),
        種別 = p.Field<int>("種別"),
        生年度 = p.Field<int>("生年度"),
        平均人員2 = p.Field<int>("平均人員") / 12,
        支給年金額 = p.Field<int>("支給年金額")
    };

foreach (var item in query4)
{
    Console.WriteLine("年度={0}, 種別={1}, 生年度={2}, 平均人員2={3}, 支給年金額={4}",
        item.年度, item.種別, item.生年度, item.平均人員2, item.支給年金額);
}

Console.WriteLine("--------------------------------------------------");
Console.ReadKey();

メソッド ベースのクエリ構文例

Console.WriteLine("List<DataRow> + メソッド ベースのクエリ構文例");
Console.WriteLine("--------------------------------------------------");

var query5 = RowList
    .Where(p => p.Field<int>("年度") == 2012)
    .Select(p => new
{
    年度 = p.Field<int>("年度"),
    種別 = p.Field<int>("種別"),
    生年度 = p.Field<int>("生年度"),
    平均人員2 = p.Field<int>("平均人員") / 12,
    支給年金額 = p.Field<int>("支給年金額")
});

foreach (var item in query5)
{
    Console.WriteLine("年度={0}, 種別={1}, 生年度={2}, 平均人員2={3}, 支給年金額={4}",
        item.年度, item.種別, item.生年度, item.平均人員2, item.支給年金額);
}

Console.WriteLine("--------------------------------------------------");
Console.ReadKey();

+ メソッド ベースのクエリ構文例 + GroupBy?

Console.WriteLine("List<DataRow> + メソッド ベースのクエリ構文例 + GroupBy");
Console.WriteLine("--------------------------------------------------");

// WhereとGroupByの両方を記述できない。
var query6 = RowList
    .Where(p => p.Field<int>("年度") == 2012)
    .Select(p => new
{
    年度 = p.Field<int>("年度"),
    種別 = p.Field<int>("種別"),
    生年度 = p.Field<int>("生年度"),
    平均人員2 = p.Field<int>("平均人員") / 12,
    支給年金額 = p.Field<int>("支給年金額")
});

var query7 = query6
    .GroupBy(p => new { p.年度, p.種別 })
    .Select(p => new
{
    年度 = p.Key.年度,
    種別 = p.Key.種別,
    平均人員2合計 = p.Sum(x => x.平均人員2),
    支給年金額合計 = p.Sum(x => x.支給年金額)
});

foreach (var item in query7)
{
    Console.WriteLine("年度={0}, 平均人員2合計={1}, 支給年金額合計={2}",
        item.年度, item.平均人員2合計, item.支給年金額合計);
}

Console.WriteLine("--------------------------------------------------");
Console.ReadKey();

データアクセス

LINQ to SQL

http://msdn.microsoft.com/ja-jp/library/bb386976.aspx

  • LINQ と呼ばれるクエリで DB アクセスを行う手法。
  • LINQ で書かれたクエリは最適化された SQL に変換され発行される。
  • LINQ to SQL で実行可能なSQL は、SELECT のみである。

2008年11月にLINQ to SQLはdisconとなり(ADO.NET Entity Framework と融合し)、
以降はADO.NET Entity FrameworkLINQ to Entitiesとして利用することになる。

LINQ to Entities

参考

その他

LINQ to DataSet?

http://msdn.microsoft.com/ja-jp/library/vstudio/bb386977.aspx

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("年度", typeof(int)));
dt.Columns.Add(new DataColumn("種別", typeof(int)));
dt.Columns.Add(new DataColumn("生年度", typeof(int)));
dt.Columns.Add(new DataColumn("平均人員", typeof(int)));
dt.Columns.Add(new DataColumn("支給年金額", typeof(int)));

DataRow dr = null;

dr = dt.NewRow();

dr["年度"] =2013;
dr["種別"] =14;
dr["生年度"] =1979;
dr["平均人員"] =200;
dr["支給年金額"] =120000;

dt.Rows.Add(dr);

dr = dt.NewRow();

dr["年度"] =2012;
dr["種別"] =15;
dr["生年度"] =1980;
dr["平均人員"] =120;
dr["支給年金額"] =65000;

dt.Rows.Add(dr);

dr = dt.NewRow();

dr["年度"] = 2012;
dr["種別"] =21;
dr["生年度"] =1981;
dr["平均人員"] =25;
dr["支給年金額"] =23000;

dt.Rows.Add(dr);

dr = dt.NewRow();

dr["年度"] =2010;
dr["種別"] =43;
dr["生年度"] =1982;
dr["平均人員"] =12;
dr["支給年金額"] =12000;

dt.Rows.Add(dr);

dr = dt.NewRow();

dr["年度"] = 2012;
dr["種別"] = 21;
dr["生年度"] = 1981;
dr["平均人員"] = 25;
dr["支給年金額"] = 23000;

dt.Rows.Add(dr);

// --------------------------------------------------

Console.WriteLine("DataTable + クエリ式の構文例");
Console.WriteLine("--------------------------------------------------");

var query3 = from p in dt.AsEnumerable()
    where p.Field<int>("年度") == 2012
    select new
    {
        年度 = p.Field<int>("年度"),
        種別 = p.Field<int>("種別"),
        生年度 = p.Field<int>("生年度"),
        平均人員2 = p.Field<int>("平均人員") / 12,
        支給年金額 = p.Field<int>("支給年金額")
    };

foreach (var item in query3)
{
    Console.WriteLine("年度={0}, 種別={1}, 生年度={2}, 平均人員2={3}, 支給年金額={4}",
        item.年度, item.種別, item.生年度, item.平均人員2, item.支給年金額);
}

Console.WriteLine("--------------------------------------------------");
Console.ReadKey();

LINQ to Dynamics CRM

  • いろいろなサンプルを見ると
  • 書けているケースと
  • 書けていないケースが

ありますが、

  • これは、
    • それぞれ、プロバイダ(LINQ to xxx)のサポートする処理が異なるためです。
    • 例えば、他のプロバイダ(LINQ to xxx)ではOUTER JOINも実装可能です。

参考

内部

ラムダ式って

式木(Expression Tree)

msdn

構文例

その他

LINQ to Object

パフォーマンス関連


Tags: :.NET開発, :データアクセス, :ADO.NET, :Entity Framework


添付ファイル: fileLINQtoObject.zip 350件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-02-08 (金) 09:22:23 (139d)