「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。 目次 †概要 †統合言語クエリ (LINQ: Language-Integrated Query) 構文 †クエリは、 という 2 とおりの構文を使って作成できる。 クエリ式の構文 †SQLっぽい書き方(例)。 メソッド ベースのクエリ構文 †Fluent API(≒ メソッド・チェーン)的に書く書き方(例)。 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
2008年11月にLINQ to SQLはdisconとなり(ADO.NET Entity Framework と融合し)、 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 †
参考 †内部 †ラムダ式って †式木(Expression Tree) †msdn †
構文例 †
その他 †
LINQ to Object †
パフォーマンス関連 †
Tags: :.NET開発, :データアクセス, :ADO.NET, :Entity Framework |