Open棟梁Project - マイクロソフト系技術情報 Wiki

目次

概要

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

LINQ to Objects

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

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

           var People = new[]{ 
              new { Name="オサダ トシヒロ", Gender=1, Age=32}, 
              new { Name="カネフジ タカエ", Gender=2, Age=46}, 
              new { Name="キョウゴク トシツグ", Gender=1, Age=11}, 
              new { Name="コウダ キミタカ", Gender=1, Age=17}, 
              new { Name="シモイズミ エイコ", Gender=2, Age=13}, 
              new { Name="センザイ シュウイチロウ", Gender=1, Age=43}, 
              new { Name="ソウリョウ ノリカズ", Gender=1, Age=21}, 
              new { Name="マツバネ タツコ", Gender=2, Age=24}, 
              new { Name="ミツジマ タカコ", Gender=2, Age=32}, 
              new { Name="ヤハタ トシチカ", Gender=1, Age=28} 
           };
           
           // --------------------------------------------------
           
           Console.WriteLine("匿名型配列 + クエリ式の構文例");
           Console.WriteLine("--------------------------------------------------");
           
           var query = from p in People
                       where p.Gender == 1 && p.Age >= 20
                       orderby p.Age
                       select p;
           
           foreach (var item in query)
           {
               Console.WriteLine("名前={0}, 年齢={1}", item.Name, item.Age);
           }
           
           Console.WriteLine("--------------------------------------------------");
           Console.ReadKey();

匿名型配列

           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.支給年金額);
           }

クエリ式の構文例(クラス指定)

   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<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 DataSet?

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

DataTable? + クエリ式の構文例

           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 Entities

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

LINQ to SQL [LINQ to SQL]

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

LINQ to Dynamics CRM

いろいろなサンプルを見ると

ありますが、これは、 それぞれプロバイダ(LINQ to xxx)の サポートする処理が異なるためです。

参考

msdn

構文例

その他

LINQ to Object


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS