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)の サポートする処理が異なるためです。