「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>データアクセスのいろいろ]] * 目次 [#pe9137b3] #contents *概要 [#f95ddfa0] 統合言語クエリ (LINQ: Language-Integrated Query) *構文 [#a9baa86f] クエリは、 -クエリ式の構文 -メソッド ベースのクエリ構文 という 2 とおりの構文を使って作成できる。 **クエリ式の構文 [#l9e94201] **メソッド ベースのクエリ構文 [#g1695dc7] *LINQ to Objects [#b29ceb6f] http://msdn.microsoft.com/ja-jp/library/vstudio/bb397919.aspx **匿名型配列 + クエリ式の構文例 [#c4c5f310] -LINQ to Objectで抽出と並び替え(配列編) どっとねっとふぁん~ http://blogonos.wordpress.com/2007/09/06/linq-to-object%E3%81%A7%E6%8A%BD%E5%87%BA%E3%81%A8%E4%B8%A6%E3%81%B3%E6%9B%BF%E3%81%88%EF%BC%88%E9%85%8D%E5%88%97%E7%B7%A8%EF%BC%89/ ***匿名型配列 [#m932251b] 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} }; ***クエリ式の構文例 [#xe281cf8] 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) + クエリ式の構文例 [#af4ac3ad] ***クラス(POCO) [#xe281cf8] class BeanClass { public int 年度; public int 種別; public int 生年度; public int 平均人員2; public int 支給年金額; } ***クエリ式の構文例 [#xe281cf8] 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 [#pe4bb771] 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 + クエリ式の構文例 [#h05d57aa] ***インデクサList [#i666a04c] 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); ***クエリ式の構文例 [#w9e4aabb] 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(); ***メソッド ベースのクエリ構文例 [#w787e665] 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 [#w787e665] 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 [#pb7c85c5] http://msdn.microsoft.com/ja-jp/library/vstudio/bb386977.aspx **DataTable + クエリ式の構文例 [#cc1f69dc] 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 SQL [#bcbba76f] 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 Framework]]の[[LINQ to Entities>#y9bce357]]として利用することになる。 **参考 [#e99954ba] -Linq to SQLって死滅しちゃうの - ものがたり~ http://d.hatena.ne.jp/atsushieno/20080609/p1 --OakLeaf Systems Is the ADO.NET Team Abandoning LINQ to SQL~ http://oakleafblog.blogspot.jp/2008/05/is-adonet-team-abandoning-linq-to-sql.html -Linq to SQLが死滅するようです。って当然じゃん。 - ものがたり~ http://d.hatena.ne.jp/atsushieno/20081103/p1 --Update on LINQ to SQL and LINQ to Entities Roadmap~ ADO.NET Blog - Site Home - MSDN Blogs~ http://blogs.msdn.com/b/adonet/archive/2008/10/29/update-on-linq-to-sql-and-linq-to-entities-roadmap.aspx --Is LINQ to SQL Truly Dead~ http://www.infoq.com/news/2008/11/DLINQ-Future -LINQ to SQLは本当に終わりなのか?~ http://www.infoq.com/jp/news/2008/11/DLINQ-Future -ADO.NET Entity Framework~ http://www.slideshare.net/daisukei/daisukei-ef/13 *[[LINQ to Entities>Entity Framework#b48c3a6f]] [#y9bce357] *LINQ to Dynamics CRM [#y3c49387] いろいろなサンプルを見ると -書けているケースと -書けていないケースが ありますが、これは、 それぞれプロバイダ(LINQ to xxx)の サポートする処理が異なるためです。 -Use LINQ to Construct a Query~ http://msdn.microsoft.com/en-us/library/gg328328.aspx --join~ Represents an inner join. You cannot perform outer joins. -例えば、他のプロバイダ(LINQ to xxx)ではOUTER JOINも実装可能。 --C# LINQ to SQL で LEFT OUTER JOIN をシンプル記述する~ http://programmers.high-way.info/cs/linqtosql-join.html *参考 [#q8caa5ff] **msdn [#o6346ae4] -LINQ to Objects~ http://msdn.microsoft.com/ja-jp/library/vstudio/bb397919.aspx -LINQ to DataSet~ http://msdn.microsoft.com/ja-jp/library/vstudio/bb386977.aspx -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 ***構文例 [#r6e0a977] -クエリ式の構文例 射影 (LINQ to DataSet)~ http://msdn.microsoft.com/ja-jp/library/vstudio/bb386943.aspx -クエリ式の構文例 射影 (LINQ to Entities)~ http://msdn.microsoft.com/ja-jp/library/bb738447.aspx -メソッド ベースのクエリ構文例 射影 (LINQ to DataSet)~ http://msdn.microsoft.com/ja-jp/library/vstudio/bb669069.aspx -メソッド ベースのクエリ構文例 射影 (LINQ to Entities)~ http://msdn.microsoft.com/ja-jp/library/bb896275.aspx **その他 [#h73a42ab] -LINQ (C# によるプログラミング入門)~ http://ufcpp.net/study/csharp/sp3_linq.html ***LINQ to Object [#b815c776] -MTG Blog ◆LINQで射影(Select)~ http://madogiwatosan.blogspot.jp/2011/04/linqselect.html -LINQ to Objectで抽出と並び替え(配列編) どっとねっとふぁん~ http://blogonos.wordpress.com/2007/09/06/linq-to-object%E3%81%A7%E6%8A%BD%E5%87%BA%E3%81%A8%E4%B8%A6%E3%81%B3%E6%9B%BF%E3%81%88%EF%BC%88%E9%85%8D%E5%88%97%E7%B7%A8%EF%BC%89/ -LINQ to Objects で グループ化 - 当面C#と.NETな記録~ http://d.hatena.ne.jp/siokoshou/20070726/p1 -Linq入門記-27 (LINQ To Object, GroupBy) - いろいろ備忘録日記~ http://d.hatena.ne.jp/gsf_zero1/20100819/p1 -.net - LinQ to objects GroupBy() by object and Sum() by amount - Stack Overflow~ http://stackoverflow.com/questions/2551086/linq-to-objects-groupby-by-object-and-sum-by-amount ---- Tags: [[:.NET開発]], [[:データアクセス]], [[:ADO.NET]], [[:Entity Framework]]