Open棟梁Project - マイクロソフト系技術情報 Wiki
統合言語クエリ (LINQ: Language-Integrated Query)
クエリは、
という 2 とおりの構文を使って作成できる。
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();
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<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();
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();
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();
http://msdn.microsoft.com/ja-jp/library/bb386976.aspx
2008年11月にLINQ to SQLはdisconとなり(ADO.NET Entity Framework と融合し)、
以降はADO.NET Entity FrameworkのLINQ to Entitiesとして利用することになる。
いろいろなサンプルを見ると
ありますが、これは、 それぞれプロバイダ(LINQ to xxx)の サポートする処理が異なるためです。