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

クラス(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 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

Entity Framework のクエリー方法

LINQ to Entities, QueryBuilder?, Entity SQL

LINQ to SQL

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

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

参考

LINQ to Dynamics CRM

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

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

参考

msdn

構文例

その他

LINQ to Object


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