SQLCompiler for LINQ(C#)
のサンプル
(基本サンプル)
<一覧表>
ファイル名 : 前版サンプルから更新したファイル名
ファイル名 説明 リンク
No1.linq 単一テーブルを使用する 表 1
No2.linq 2つのテーブルのクロス結合を使用する 表 2
No3.linq 2つのテーブルの内部結合を使用する 表 3
No4.linq No3.linq で GROUP BY 句, ORDER BY 句, COUNT(*)を使用する 表 4
No5.linq 二項演算子(+)を使用する 表 5
No6.linq 単純 CASE 式を使用する 表 6
No7.linq 検索 CASE 式を使用する 表 7
No8.linq 単項演算子と括弧式を使用する 表 8
No9.linq 検索条件に括弧を使用する 表 9
No10.linq 検索条件に NOT を使用する 表 10
No11.linq 数値(小数)リテラルを使用する 表 11
No12.linq GROUP BY 句と AVG 関数を使用する 表 12
No13.linq No12.linq の AVG 関数に DISTINCT を使用する 表 13
No14.linq GROUP BY 句と COUNT 関数を使用する 表 14
No15.linq No14.linq の COUNT 関数に DISTINCT を使用する 表 15
No16.linq FROM 句でサブクエリを使用する 表 16
No17.linq WHERE 句でサブクエリを使用する 表 17
No17_2.linq No17.linq と等価な SQL を IN 限定子を使用して作成する 表 17_2
No18.linq HAVING 句でサブクエリを使用する 表 18
No19.linq 選択リストでサブクエリを使用する 表 19
No20.linq LIKE 限定子を使用する 表 20
No21.linq No20.linq で NOT LIKE 限定子を使用する 表 21
No22.linq No21.linq の述語全体を否定する 表 22
No23.linq BETWEEN 限定子を使用する 表 23
No24.linq No23.linq で NOT BETWEEN 限定子を使用する 表 24
No25.linq No24.linq の述語全体を否定する 表 25
No26.linq IS NULL 限定子を使用する 表 26
No27.linq No26.linq で IS NOT NULL 限定子を使用する 表 27
No28.linq No27.linq の述語全体を否定する 表 28
No29.linq IN 限定子を使用する 表 29
No30.linq No29.linq で NOT IN 限定子を使用する 表 30
No31.linq No30.linq の述語全体を否定する 表 31
No32.linq EXISTS 限定子を使用する 表 32
No33.linq No32.linq を NOT EXISTS 限定子にする 表 33
No34.linq ALL 限定子を使用する 表 34
No35.linq No34.linq を NOT ALL 限定子にする 表 35
No36.linq ANY 限定子を使用する 表 36
No37.linq No36.linq で NOT ANY 限定子を使用する 表 37
No38.linq IN 限定子を使用する 表 38
No39.linq No38.linq で NOT IN 限定子を使用する 表 39
No40.linq No39.linq の述語全体を否定する 表 40
No43.linq 自己結合を使用する 表 43
No45.linq 集合演算を FROM 句で使用する 表 45
No46.linq 集合演算を WHERE 句で使用する 表 46
No46_2.linq No46.linq の WHERE 句で IN 限定子を使用する 表 46_2
No47.linq 集合演算を選択リストで使用する 表 47
No48.linq 集合演算をルートクエリで使用する 表 48
No49.linq ビット型を FROM 句で使用する 表 49
No50.linq No49.linq の 2 つ目の結合キーの左辺と右辺を入れ替える 表 50 No50_2.linq No50.linq の 2 つ目の結合キーを WHEHE 句に移動する 表 50_2
No51.linq ビット型を WHERE 句で使用する 表 51
No52.linq ビット型を選択リストで使用する 表 52
No53.linq 時間型を FROM 句で使用する 表 53
No54.linq 時間型を WHERE 句で使用する 表 54
No55_2.linq 時間型を選択リストで使用する(1) 表 55_2
No55_3.linq 時間型を選択リストで使用する(2) 表 55_3
No55_5.linq 時間型を選択リストで使用する(3) 表 55_5
No56_2.linq 選択リストで 「リレーションエイリアス.*」を指定する 表 56_2
No57_2.linq 選択リストで 「テーブル名.*」を指定する 表 57_2
No58_2.linq テーブルにエイリアスを付与しないでテーブル名を直接使用する 表 58_2
No59.linq ORDER BY 句を数値で指定する 表 59
No60.linq ORDER BY 句をカラム名で指定する(1) 表 60
No61.linq ORDER BY 句をカラム名で指定する(2) 表 61
No62.linq ORDER BY 句で選択リストに含まれないカラム名を指定する(1) 表 62 No63.linq ORDER BY 句で選択リストに含まれないカラム名を指定する(2) 表 63
No75.linq 集合演算に ORDER BY 句を使用する 表 75
ファイル名 No1.linq
説明 単一テーブルを使用する
T-SQL SELECT TOP 10 au_lname, au_fname FROM authors
WHERE au_id = '172-32-1176' LINQ コード authors
.Where(x1 => x1.au_id == "172-32-1176") .Select(x1 => new
{
x1.au_lname, x1.au_fname })
.Take(10);
TopPage
ファイル名 No2.linq
説明 2つのテーブルのクロス結合を使用する
T-SQL SELECT t2.au_id, t1.au_lname
FROM authors AS t1, titleauthor AS t2 WHERE t1.au_id = t2.au_id
LINQ コード authors
.SelectMany(t2 => titleauthors, (t1, t2) => new{t1, t2}) .Where(x1 => x1.t1.au_id == x1.t2.au_id) .Select(x1 => new
{
x1.t2.au_id, x1.t1.au_lname });
TopPage
ファイル名 No3.linq
説明 2つのテーブルの内部結合を使用する
T-SQL SELECT t2.au_id, t1.au_lname
FROM authors AS t1 INNER JOIN titleauthor AS t2 ON t1.au_id = t2.au_id
LINQ コード authors
.Join(titleauthors, t1 => t1.au_id, t2 => t2.au_id,
(t1, t2) => new{t1, t2}) .Select(x1 => new
{
x1.t2.au_id, x1.t1.au_lname });
TopPage
ファイル名 No4.linq
説明 No3.linq で GROUP BY 句, ORDER BY 句, COUNT(*)を使用する T-SQL SELECT t2.au_id, COUNT(*)
FROM authors AS t1 INNER JOIN titleauthor AS t2 ON t1.au_id = t2.au_id
GROUP BY t2.au_id ORDER BY t2.au_id DESC LINQ コード authors
.Join(titleauthors, t1 => t1.au_id, t2 => t2.au_id,
(t1, t2) => new{t1, t2})
.GroupBy(x1 => new{grKey1 = x1.t2.au_id}) .Select(g1 => new
{
au_id = g1.Key.grKey1, root_alias_2 = g1.Count() })
.OrderByDescending(t => t.au_id);
TopPage
ファイル名 No5.linq
説明 二項演算子(+)を使用する
T-SQL SELECT au_lname + '-' + au_fname AS au_name FROM authors
WHERE au_id = '172-32-1176' LINQ コード authors
.Where(x1 => x1.au_id == "172-32-1176") .Select(x1 => new
{
au_name = x1.au_lname + "-" + x1.au_fname });
TopPage
ファイル名 No6.linq
説明 単純 CASE 式を使用する
T-SQL SELECT t2.au_id, CASE COUNT(*)
WHEN 1 THEN 'one'
WHEN 2 THEN 'two' ELSE 'over' END AS kosu FROM authors AS t1 INNER JOIN titleauthor AS t2
ON t1.au_id = t2.au_id GROUP BY t2.au_id
LINQ コード authors
.Join(titleauthors, t1 => t1.au_id, t2 => t2.au_id,
(t1, t2) => new{t1, t2})
.GroupBy(x1 => new{grKey1 = x1.t2.au_id}) .Select(g1 => new
{
au_id = g1.Key.grKey1,
kosu = (g1.Count() == 1 ? "one" :
g1.Count() == 2 ? "two" : "over") });
TopPage
ファイル名 No7.linq
説明 検索 CASE 式を使用する
T-SQL SELECT t2.au_id, CASE WHEN COUNT(*) <= 2 THEN 'onetwo' ELSE 'over' END AS kosu
FROM authors AS t1 INNER JOIN titleauthor AS t2 ON t1.au_id = t2.au_id
GROUP BY t2.au_id LINQ コード authors
.Join(titleauthors, t1 => t1.au_id, t2 => t2.au_id,
(t1, t2) => new{t1, t2})
.GroupBy(x1 => new{grKey1 = x1.t2.au_id}) .Select(g1 => new
{
au_id = g1.Key.grKey1,
kosu = (g1.Count() <= 2 ? "onetwo" : "over") });
TopPage
ファイル名 No8.linq
説明 単項演算子と括弧式を使用する
T-SQL SELECT au_id, -(au_ord + royaltyper) AS var FROM titleauthor
WHERE au_id = '172-32-1176' LINQ コード titleauthors
.Where(x1 => x1.au_id == "172-32-1176")
.Select(x1 => new {
x1.au_id,
var = -(x1.au_ord + x1.royaltyper) });
TopPage
ファイル名 No9.linq
説明 検索条件に括弧を使用する
T-SQL SELECT au_id FROM titleauthor
WHERE (au_id = '172-32-1176' AND
((title_id = 'PS3333' OR title_id = 'BU1032') AND
(au_ord = 1 OR au_ord = 2)) AND
royaltyper = 100) LINQ コード titleauthors
.Where(x1 => (x1.au_id == "172-32-1176" && ((x1.title_id == "PS3333" ||
x1.title_id == "BU1032") &&
(x1.au_ord == 1 || x1.au_ord == 2)) && x1.royaltyper ==
100))
.Select(x1 => new {
x1.au_id });
TopPage
ファイル名 No10.linq
説明 検索条件に NOT を使用する
T-SQL SELECT au_id FROM titleauthor
WHERE (NOT au_id = '172-32-1176' AND NOT
(au_ord = 3 OR au_ord = 1) AND NOT royaltyper = 40) LINQ コード titleauthors
.Where(x1 => (!(x1.au_id == "172-32-1176") && !(x1.au_ord == 3 ||
x1.au_ord == 1) && !(x1.royaltyper == 40))) .Select(x1 => new
{
x1.au_id });
TopPage
ファイル名 No11.linq
説明 数値(小数)リテラルを使用する
T-SQL SELECT au_id, au_ord + 1.1 AS goukei FROM titleauthor
WHERE au_id = '172-32-1176' LINQ コード titleauthors
.Where(x1 => x1.au_id == "172-32-1176") .Select(x1 => new
{
x1.au_id,
goukei = x1.au_ord + 1.1 });
TopPage
ファイル名 No12.linq
説明 GROUP BY 句と AVG 関数を使用する
T-SQL SELECT au_ord, AVG(royaltyper) AS heikin FROM titleauthor
GROUP BY au_ord LINQ コード titleauthors
.GroupBy(x1 => new{grKey1 = x1.au_ord}) .Select(g1 => new
{
au_ord = g1.Key.grKey1,
heikin = g1.Average(x1 => x1.royaltyper) });
TopPage
ファイル名 No13.linq
説明 No12.linq の AVG 関数に DISTINCT を使用する
T-SQL SELECT au_ord, AVG(DISTINCT royaltyper) AS heikin FROM titleauthor
GROUP BY au_ord LINQ コード titleauthors
.GroupBy(x1 => new{grKey1 = x1.au_ord}) .Select(g1 => new
{
au_ord = g1.Key.grKey1,
heikin = g1.Select(x1 => (int?)(x1.royaltyper)).Distinct().Average()
});
TopPage
ファイル名 No14.linq
説明 GROUP BY 句と COUNT 関数を使用する
T-SQL SELECT au_ord, COUNT(au_ord) AS kosuu FROM titleauthor
GROUP BY au_ord LINQ コード titleauthors
.GroupBy(x1 => new{grKey1 = x1.au_ord}) .Select(g1 => new
{
au_ord = g1.Key.grKey1,
kosuu = g1.Count(x1 => g1.Key.grKey1 != null) });
TopPage
ファイル名 No15.linq
説明 No14.linq の COUNT 関数に DISTINCT を使用する
T-SQL SELECT au_ord, COUNT(DISTINCT royaltyper) AS kosuu FROM titleauthor
GROUP by au_ord LINQ コード titleauthors
.GroupBy(x1 => new{grKey1 = x1.au_ord}) .Select(g1 => new
{
au_ord = g1.Key.grKey1,
kosuu = g1.Where(x1 => x1.royaltyper != null).Select(x1 =>
x1.royaltyper).Distinct().Count() });
TopPage
ファイル名 No16.linq
説明 FROM 句でサブクエリを使用する
T-SQL SELECT t2.au_id, t2.au_lname + ' ' + t2.au_fname AS namae, t1.royaltyper FROM (SELECT au_id, royaltyper
FROM titleauthor
WHERE royaltyper = 100) AS t1 INNER JOIN authors AS t2 ON t1.au_id = t2.au_id
LINQ コード titleauthors
.Where(x2 => x2.royaltyper == 100) .Select(x2 => new
{
x2.au_id, x2.royaltyper })
.Join(authors,
t1 => t1.au_id, t2 => t2.au_id,
(t1, t2) => new{t1, t2}) .Select(x1 => new
{
x1.t2.au_id,
namae = x1.t2.au_lname + " " + x1.t2.au_fname, x1.t1.royaltyper
});
TopPage
ファイル名 No17.linq
説明 WHERE 句でサブクエリを使用する
T-SQL SELECT t1.au_id
FROM titleauthor AS t1 WHERE (SELECT t2.au_id
FROM authors AS t2
WHERE t1.au_id = t2.au_id AND t1.royaltyper = 100)
= '172-32-1176' LINQ コード titleauthors
.Where(x1 => authors
.Where(x2 => x1.au_id == x2.au_id && x1.royaltyper == 100) .Select(x2 => new
{
x2.au_id
}).Any(t => "172-32-1176" == t.au_id)) .Select(x1 => new
{
x1.au_id });
TopPage
ファイル名 No17_2.linq
説明 No17.linq と等価な SQL を IN 限定子を使用して作成する
T-SQL SELECT t1.au_id
FROM titleauthor AS t1
WHERE '172-32-1176' IN (SELECT t2.au_id FROM authors AS t2
WHERE t1.au_id = t2.au_id AND t1.royaltyper = 100) LINQ コード titleauthors
.Where(x1 => authors
.Where(x2 => x1.au_id == x2.au_id && x1.royaltyper == 100) .Select(x2 => new
{
x2.au_id
}).Any(t => "172-32-1176" == t.au_id)) .Select(x1 => new
{
x1.au_id });
TopPage
ファイル名 No18.linq
説明 HAVING 句でサブクエリを使用する
T-SQL SELECT stor_id FROM sales GROUP BY stor_id
HAVING AVG(qty) > (SELECT AVG(qty) FROM sales
WHERE payterms = 'Net 30' GROUP BY payterms)
LINQ コード sales
.GroupBy(x1 => new{grKey1 = x1.stor_id})
.Where(g1 => g1.Average(x1 => (int?)(x1.qty)) > sales
.Where(x2 => x2.payterms
== "Net 30")
.GroupBy(x2 => new {grKe y2 = x2.payterms})
.Select(g2 => g2.Average (x2 => (int?)(x2.qty))).SingleOrDefault())
.Select(g1 => new {
stor_id = g1.Key.grKey1 });
TopPage
ファイル名 No19.linq
説明 選択リストでサブクエリを使用する
T-SQL SELECT stor_id, qty - (SELECT AVG(qty) FROM sales
WHERE stor_id = '7067' GROUP BY stor_id) AS diff FROM sales
WHERE stor_id = '7067' LINQ コード sales
.Where(x1 => x1.stor_id == "7067") .Select(x1 => new
{
x1.stor_id,
diff = x1.qty - sales
.Where(x2 => x2.stor_id == "7067") .GroupBy(x2 => new{grKey1 = x2.stor_id})
.Select(g1 => g1.Average(x2 => (int?)(x2.qty))).Sing leOrDefault()
});
TopPage
ファイル名 No20.linq
説明 LIKE 限定子を使用する
T-SQL SELECT au_id, title_id FROM titleauthor
WHERE title_id LIKE 'PS%' LINQ コード titleauthors
.Where(x1 => System.Data.Linq.SqlClient.SqlMethods.Like(x1.title_id,
"PS%"))
.Select(x1 => new {
x1.au_id, x1.title_id });
TopPage
ファイル名 No21.linq
説明 No20.linq で NOT LIKE 限定子を使用する T-SQL SELECT au_id, title_id
FROM titleauthor
WHERE title_id NOT LIKE 'PS%' LINQ コード titleauthors
.Where(x1 => !(System.Data.Linq.SqlClient.SqlMethods.Like(x1.title_id,
"PS%")))
.Select(x1 => new {
x1.au_id, x1.title_id });
TopPage
ファイル名 No22.linq
説明 No21.linq の述語全体を否定する
T-SQL SELECT au_id, title_id FROM titleauthor
WHERE NOT title_id NOT LIKE 'PS%' LINQ コード titleauthors
.Where(x1 => System.Data.Linq.SqlClient.SqlMethods.Like(x1.title_id,
"PS%"))
.Select(x1 => new {
x1.au_id, x1.title_id });
TopPage
ファイル名 No23.linq
説明 BETWEEN 限定子を使用する
T-SQL SELECT au_id, royaltyper FROM titleauthor
WHERE royaltyper BETWEEN 75 AND 100 LINQ コード titleauthors
.Where(x1 => x1.royaltyper >= 75 && x1.royaltyper <= 100) .Select(x1 => new
{
x1.au_id, x1.royaltyper });
TopPage
ファイル名 No24.linq
説明 No23.linq で NOT BETWEEN 限定子を使用する T-SQL SELECT au_id, royaltyper
FROM titleauthor
WHERE royaltyper NOT BETWEEN 75 AND 100 LINQ コード titleauthors
.Where(x1 => !(x1.royaltyper >= 75 && x1.royaltyper <= 100)) .Select(x1 => new
{
x1.au_id, x1.royaltyper });
TopPage
ファイル名 No25.linq
説明 No24.linq の述語全体を否定する
T-SQL SELECT au_id, royaltyper FROM titleauthor
WHERE NOT royaltyper NOT BETWEEN 75 AND 100 LINQ コード titleauthors
.Where(x1 => x1.royaltyper >= 75 && x1.royaltyper <= 100) .Select(x1 => new
{
x1.au_id,
x1.royaltyper });
TopPage
ファイル名 No26.linq
説明 IS NULL 限定子を使用する
T-SQL SELECT title_id FROM titles
WHERE price IS NULL LINQ コード titles
.Where(x1 => x1.price == null) .Select(x1 => new
{
x1.title_id });
TopPage
ファイル名 No27.linq
説明 No26.linq で IS NOT NULL 限定子を使用する T-SQL SELECT title_id
FROM titles
WHERE price IS NOT NULL LINQ コード titles
.Where(x1 => !(x1.price == null)) .Select(x1 => new
{
x1.title_id });
TopPage
ファイル名 No28.linq
説明 No27.linq の述語全体を否定する
T-SQL SELECT title_id FROM titles
WHERE NOT price IS NOT NULL LINQ コード titles
.Where(x1 => x1.price == null) .Select(x1 => new
{
x1.title_id });
TopPage
ファイル名 No29.linq
説明 IN 限定子を使用する
T-SQL SELECT au_ord FROM titleauthor WHERE au_ord IN (2,3) LINQ コード titleauthors
.Where(x1 => (new int?[]{2, 3}).Contains(x1.au_ord)) .Select(x1 => new
{
x1.au_ord });
TopPage
ファイル名 No30.linq
説明 No29.linq で NOT IN 限定子を使用する T-SQL SELECT au_ord
FROM titleauthor
WHERE au_ord NOT IN (2,3) LINQ コード titleauthors
.Where(x1 => !((new int?[]{2, 3}).Contains(x1.au_ord))) .Select(x1 => new
{
x1.au_ord });
TopPage
ファイル名 No31.linq
説明 No30.linq の述語全体を否定する
T-SQL SELECT au_ord FROM titleauthor
WHERE NOT au_ord NOT IN (2,3) LINQ コード titleauthors
.Where(x1 => (new int?[]{2, 3}).Contains(x1.au_ord)) .Select(x1 => new
{
x1.au_ord });
TopPage
ファイル名 No32.linq
説明 EXISTS 限定子を使用する
T-SQL SELECT t1.title_id FROM titles AS t1 WHERE EXISTS (SELECT *
FROM titleauthor AS t2
WHERE t1.title_id = t2.title_id AND t2.au_ord = 3) LINQ コード titles
.Where(x1 => titleauthors.Any(x2 => x1.title_id == x2.title_id &&
x2.au_ord == 3)) .Select(x1 => new {
x1.title_id });
TopPage
ファイル名 No33.linq
説明 No32.linq を NOT EXISTS 限定子にする T-SQL SELECT t1.title_id
FROM titles AS t1
WHERE NOT EXISTS (SELECT *
FROM titleauthor AS t2
WHERE t1.title_id = t2.title_id AND t2.au_ord = 3) LINQ コード titles
.Where(x1 => !(titleauthors.Any(x2 => x1.title_id == x2.title_id &&
x2.au_ord == 3))) .Select(x1 => new {
x1.title_id });
TopPage
ファイル名 No34.linq
説明 ALL 限定子を使用する
T-SQL SELECT stor_id FROM sales GROUP BY stor_id
HAVING AVG(qty) >= ALL (SELECT AVG(qty) FROM sales
GROUP BY payterms) LINQ コード sales
.GroupBy(x1 => new{grKey1 = x1.stor_id}) .Where(g1 => sales
.GroupBy(x2 => new {grKey2 = x2.payterms}) .Select(g2 => new
{
res1 = g2.Average(x2 => (int?)(x2.qty))
}).All(t => g1.Average(x1 => (int?)(x1.qty)) >= t.res1)) .Select(g1 => new
{
stor_id = g1.Key.grKey1 });
TopPage
ファイル名 No35.linq
説明 No34.linq を NOT ALL 限定子にする T-SQL SELECT stor_id
FROM sales GROUP BY stor_id
HAVING NOT AVG(qty) >= ALL (SELECT AVG(qty) FROM sales
GROUP BY payterms) LINQ コード sales
.GroupBy(x1 => new{grKey1 = x1.stor_id}) .Where(g1 => !(sales
.GroupBy(x2 => new {grKey2 = x2.payterms}) .Select(g2 => new
{
res1 = g2.Average(x2 => (int?)(x2.qty))
}).All(t => g1.Average(x1 => (int?)(x1.qty)) >= t.res1))) .Select(g1 => new
{
stor_id = g1.Key.grKey1 });
TopPage
ファイル名 No36.linq
説明 ANY 限定子を使用する
T-SQL SELECT stor_id FROM sales GROUP BY stor_id
HAVING AVG(qty) >= ANY (SELECT AVG(qty) FROM sales
GROUP BY payterms) LINQ コード sales
.GroupBy(x1 => new{grKey1 = x1.stor_id}) .Where(g1 => sales
.GroupBy(x2 => new {grKey2 = x2.payterms}) .Select(g2 => new
{
res1 = g2.Average(x2 => (int?)(x2.qty))
}).Any(t => g1.Average(x1 => (int?)(x1.qty)) >= t.res1))
.Select(g1 => new {
stor_id = g1.Key.grKey1 });
TopPage
ファイル名 No37.linq
説明 No36.linq で NOT ANY 限定子を使用する T-SQL SELECT stor_id
FROM sales GROUP BY stor_id
HAVING NOT AVG(qty) >= ANY (SELECT AVG(qty) FROM sales
GROUP BY payterms) LINQ コード sales
.GroupBy(x1 => new{grKey1 = x1.stor_id}) .Where(g1 => !(sales
.GroupBy(x2 => new {grKey2 = x2.payterms}) .Select(g2 => new
{
res1 = g2.Average(x2 => (int?)(x2.qty))
}).Any(t => g1.Average(x1 => (int?)(x1.qty)) >= t.res1))) .Select(g1 => new
{
stor_id = g1.Key.grKey1 });
TopPage
ファイル名 No38.linq
説明 IN 限定子を使用する
T-SQL SELECT stor_id, qty FROM sales
WHERE qty IN (SELECT qty FROM sales
WHERE payterms = 'ON invoice') LINQ コード sales
.Where(x1 => sales
.Where(x2 => x2.payterms == "ON invoice") .Select(x2 => new
{
x2.qty
}).Any(t => x1.qty == t.qty)) .Select(x1 => new
{
x1.stor_id, x1.qty
});
TopPage
ファイル名 No39.linq
説明 No38.linq で NOT IN 限定子を使用する T-SQL SELECT stor_id, qty
FROM sales
WHERE qty NOT IN (SELECT qty FROM sales
WHERE payterms = 'ON invoice') LINQ コード sales
.Where(x1 => sales
.Where(x2 => x2.payterms == "ON invoice") .Select(x2 => new
{
x2.qty
}).All(t => x1.qty != t.qty)) .Select(x1 => new
{
x1.stor_id, x1.qty });
TopPage
ファイル名 No40.linq
説明 No39.linq の述語全体を否定する
T-SQL SELECT stor_id, qty FROM sales
WHERE NOT qty IN NOT (SELECT qty FROM sales
WHERE payterms = 'ON invoice') LINQ コード sales
.Where(x1 => !(sales
.Where(x2 => x2.payterms == "ON invoice") .Select(x2 => new
{
x2.qty
}).All(t => x1.qty != t.qty))) .Select(x1 => new
{
x1.stor_id, x1.qty });
TopPage
ファイル名 No43.linq
説明 自己結合を使用する
T-SQL SELECT t1.stor_id AS store1, t2.stor_id AS store2 FROM stores AS t1, stores AS t2
WHERE t1.stor_id < t2.stor_id LINQ コード stores
.SelectMany(t2 => stores,
(t1, t2) => new{t1, t2})
.Where(x1 => string.Compare(x1.t1.stor_id,x1.t2.stor_id) < 0) .Select(x1 => new
{
store1 = x1.t1.stor_id, store2 = x1.t2.stor_id });
TopPage
ファイル名 No45.linq
説明 集合演算を FROM 句で使用する
T-SQL SELECT t3.au_id, t3.namae1, t3.r1
FROM (SELECT t2.au_id, t2.au_lname + ' ' + t2.au_fname AS namae1, t1.royaltyper AS r1
FROM (SELECT au_id, royaltyper FROM titleauthor
WHERE royaltyper = 100
) AS t1 INNER JOIN authors AS t2 ON t1.au_id = t2.au_id UNION
SELECT t2.au_id, t2.au_lname + ' ' + t2.au_fname AS namae2, t1.royaltyper AS r2
FROM (SELECT au_id, royaltyper FROM titleauthor
WHERE royaltyper <> 100
) AS t1 INNER JOIN authors AS t2 ON t1.au_id = t2.au_id ) t3
ORDER BY t3.r1 LINQ コード titleauthors
.Where(x3 => x3.royaltyper == 100) .Select(x3 => new
{
x3.au_id, x3.royaltyper })
.Join(authors,
t1 => t1.au_id, t2 => t2.au_id,
(t1, t2) => new{t1, t2}) .Select(x2 => new
{
x2.t2.au_id,
namae1 = x2.t2.au_lname + " " + x2.t2.au_fname, r1 = x2.t1.royaltyper
})
.Union(titleauthors
.Where(x5 => x5.royaltyper != 100) .Select(x5 => new
{
x5.au_id, x5.royaltyper })
.Join(authors,
t1 => t1.au_id, t2 => t2.au_id,
(t1, t2) => new{t1, t2}) .Select(x4 => new
{
x4.t2.au_id,
namae1 = x4.t2.au_lname + " " + x4.t2.au_fname, r1 = x4.t1.royaltyper
})) .Select(x1 => new {
x1.au_id, x1.namae1, x1.r1 })
.OrderBy(t => t.r1);
TopPage
ファイル名 No46.linq
説明 集合演算を WHERE 句で使用する
T-SQL SELECT t1.au_id
FROM titleauthor AS t1 WHERE (
SELECT t2.au_id FROM authors AS t2
WHERE t1.au_id = t2.au_id AND t1.royaltyper = 100 UNION
SELECT t2.au_id FROM authors AS t2
WHERE t1.au_id = t2.au_id AND t1.royaltyper <> 100 ) = '172-32-1176'
LINQ コード titleauthors
.Where(x1 => authors
.Where(x2 => x1.au_id == x2.au_id && x1.royaltyper == 100)
.Select(x2 => new {
x2.au_id })
.Union(authors
.Where(x3 => x1.au_id == x3.au_id && x1.royaltyper
!= 100)
.Select(x3 => new {
x3.au_id
})).Any(t => "172-32-1176" == t.au_id)) .Select(x1 => new
{
x1.au_id });
TopPage
ファイル名 No46_2.linq
説明 No46.linq の WHERE 句で IN 限定子を使用する T-SQL SELECT t1.au_id
FROM titleauthor AS t1 WHERE '172-32-1176' IN (
SELECT t2.au_id FROM authors AS t2
WHERE t1.au_id = t2.au_id AND t1.royaltyper = 100 UNION
SELECT t2.au_id FROM authors AS t2
WHERE t1.au_id = t2.au_id
AND t1.royaltyper <> 100) LINQ コード titleauthors
.Where(x1 => authors
.Where(x2 => x1.au_id == x2.au_id && x1.royaltyper == 100) .Select(x2 => new
{
x2.au_id })
.Union(authors
.Where(x3 => x1.au_id == x3.au_id && x1.royaltyper
!= 100)
.Select(x3 => new {
x3.au_id
})).Any(t => "172-32-1176" == t.au_id)) .Select(x1 => new
{
x1.au_id });
TopPage
ファイル名 No47.linq
説明 集合演算を選択リストで使用する
T-SQL SELECT t1.au_ord, t1.royaltyper - ( SELECT AVG(royaltyper) FROM titleauthor AS t1
WHERE t1.au_ord = 1 GROUP BY t1.au_ord UNION
SELECT AVG(royaltyper) FROM titleauthor AS t1 WHERE t1.au_ord = 1
GROUP BY t1.au_ord) AS diff FROM titleauthor AS t1
WHERE au_ord = 1 LINQ コード titleauthors
.Where(x1 => x1.au_ord == 1) .Select(x1 => new
{
x1.au_ord,
diff = x1.royaltyper - titleauthors
.Where(x2 => x2.au_ord == 1)
.GroupBy(x2 => new{grKey1 = x2.au_ord}) .Select(g1 => g1.Average(x2 =>
x2.royaltyper))
.Union(titleauthors
.Where(x3 => x3.au_ord == 1) .GroupBy(x3 => new{grKey2 = x3.au_ord})
.Select(g2 => g2.Average(x3 =>
x3.royaltyper))).SingleOrDefault() });
TopPage
ファイル名 No48.linq
説明 集合演算をルートクエリで使用する
T-SQL SELECT au_id, title_id FROM titleauthor WHERE au_ord = 1 UNION
SELECT au_id, title_id FROM titleauthor WHERE au_ord <> 1 LINQ コード titleauthors
.Where(x1 => x1.au_ord == 1) .Select(x1 => new
{
x1.au_id, x1.title_id })
.Union(titleauthors
.Where(x2 => x2.au_ord != 1) .Select(x2 => new
{
x2.au_id, x2.title_id }));
TopPage
ファイル名 No49.linq
説明 ビット型を FROM 句で使用する
T-SQL SELECT a.au_id, t.title_id
FROM authors AS a INNER JOIN titleauthor AS t ON a.au_id = t.au_id
AND a.contract = 1 LINQ コード authors
.Join(titleauthors,
a => new{a.au_id, key1 = a.contract},
t => new{t.au_id, key1 = (1 == 0 ? false : true)}, (a, t) => new{a, t})
.Select(x1 => new {
x1.a.au_id, x1.t.title_id });
TopPage
ファイル名 No50.linq
説明 No49.linq の 2 つ目の結合キーの左辺と右辺を入れ替える
T-SQL SELECT a.au_id, t.title_id
FROM authors AS a INNER JOIN titleauthor AS t ON a.au_id = t.au_id
AND 1 = a.contract LINQ コード authors
.Join(titleauthors,
a => new{a.au_id, key1 = a.contract},
t => new{t.au_id, key1 = (1 == 0 ? false : true)}, (a, t) => new{a, t})
.Select(x1 => new {
x1.a.au_id, x1.t.title_id });
TopPage
ファイル名 No50_2.linq
説明 No50.linq の 2 つ目の結合キーを WHEHE 句に移動する T-SQL SELECT a.au_id, t.title_id
FROM authors AS a INNER JOIN titleauthor AS t ON a.au_id = t.au_id
WHERE 1 = a.contract LINQ コード authors
.Join(titleauthors, a => a.au_id, t => t.au_id,
(a, t) => new{a, t})
.Where(x1 => (1 == 0 ? false : true) == x1.a.contract) .Select(x1 => new
{
x1.a.au_id, x1.t.title_id });
TopPage
ファイル名 No51.linq
説明 ビット型を WHERE 句で使用する
T-SQL SELECT a.au_id, t.title_id
FROM authors AS a INNER JOIN titleauthor AS t ON a.au_id = t.au_id
WHERE a.contract = 1 LINQ コード authors
.Join(titleauthors, a => a.au_id, t => t.au_id,
(a, t) => new{a, t})
.Where(x1 => x1.a.contract == (1 == 0 ? false : true)) .Select(x1 => new
{
x1.a.au_id, x1.t.title_id });
TopPage
ファイル名 No52.linq
説明 ビット型を選択リストで使用する
T-SQL SELECT a.au_id, a.contract, t.title_id
FROM authors AS a INNER JOIN titleauthor AS t
ON a.au_id = t.au_id AND a.state = 'UT' LINQ コード authors
.Join(titleauthors,
a => new{a.au_id, key1 = a.state}, t => new{t.au_id, key1 = "UT"}, (a, t) => new{a, t})
.Select(x1 => new {
x1.a.au_id, x1.a.contract, x1.t.title_id });
TopPage
ファイル名 No53.linq
説明 時間型を FROM 句で使用する
T-SQL SELECT t1.title_id, t2.au_id
FROM titles AS t1 INNER JOIN titleauthor AS t2 ON t1.title_id = t2.title_id
AND t1.pubdate > '2000-01-01' LINQ コード titles
.SelectMany(t2 => titleauthors, (t1, t2) => new{t1, t2})
.Where(x1 => x1.t1.title_id == x1.t2.title_id && x1.t1.pubdate >
DateTime.Parse("2000-01-01")) .Select(x1 => new
{
x1.t1.title_id, x1.t2.au_id });
TopPage
ファイル名 No54.linq
説明 時間型を WHERE 句で使用する
T-SQL SELECT t1.title_id, t2.au_id
FROM titles AS t1 INNER JOIN titleauthor AS t2 ON t1.title_id = t2.title_id
WHERE t1.pubdate > '2000-01-01' LINQ コード titles
.Join(titleauthors,
t1 => t1.title_id, t2 => t2.title_id, (t1, t2) => new{t1, t2})
.Where(x1 => x1.t1.pubdate > DateTime.Parse("2000-01-01")) .Select(x1 => new
{
x1.t1.title_id, x1.t2.au_id });
TopPage
ファイル名 No55_2.linq
説明 時間型を選択リストで使用する(1)
T-SQL SELECT t1.title_id, t1.pubdate, t2.au_id FROM titles AS t1 INNER JOIN titleauthor AS t2
ON t1.title_id = t2.title_id WHERE t2.au_ord = 3
LINQ コード titles
.Join(titleauthors,
t1 => t1.title_id, t2 => t2.title_id, (t1, t2) => new{t1, t2}) .Where(x1 => x1.t2.au_ord == 3) .Select(x1 => new
{
x1.t1.title_id, x1.t1.pubdate, x1.t2.au_id });
TopPage
ファイル名 No55_3.linq
説明 時間型を選択リストで使用する(2)
T-SQL SELECT t1.title_id, t1.pubdate, t2.au_id FROM titles AS t1 INNER JOIN titleauthor AS t2
ON t1.title_id = t2.title_id
AND t1.royalty = t2.au_ord * 10 LINQ コード titles
.Join(titleauthors,
t1 => new{t1.title_id, key1 = t1.royalty}, t2 => new{t2.title_id, key1 = t2.au_ord * 10}, (t1, t2) => new{t1, t2})
.Select(x1 => new {
x1.t1.title_id, x1.t1.pubdate, x1.t2.au_id });
TopPage
ファイル名 No55_5.linq
説明 時間型を選択リストで使用する(3)
T-SQL SELECT t1.title_id, t1.pubdate, t1.pubdate + 1 FROM titles AS t1 INNER JOIN titleauthor AS t2
ON t1.title_id = t2.title_id
AND t1.royalty = t2.au_ord * 10 LINQ コード titles
.Join(titleauthors,
t1 => new{t1.title_id, key1 = t1.royalty}, t2 => new{t2.title_id, key1 = t2.au_ord * 10}, (t1, t2) => new{t1, t2})
.Select(x1 => new {
x1.t1.title_id, x1.t1.pubdate,
root_alias_3 = x1.t1.pubdate + TimeSpan.FromDays((double)(1)) });
TopPage
ファイル名 No56_2.linq
説明 選択リストで 「リレーションエイリアス.*」を指定する
T-SQL SELECT t.*
FROM authors AS a INNER JOIN titleauthor AS t ON a.au_id = t.au_id
WHERE t.au_ord = 3 LINQ コード authors
.Join(titleauthors, a => a.au_id, t => t.au_id,
(a, t) => new{a, t}) .Where(x1 => x1.t.au_ord == 3) .Select(x1 => new
{
x1.t.au_id, x1.t.title_id, x1.t.au_ord, x1.t.royaltyper });
TopPage
ファイル名 No57_2.linq
説明 選択リストで 「テーブル名.*」を指定する
T-SQL SELECT titleauthor.*
FROM authors INNER JOIN titleauthor
ON authors.au_id = titleauthor.au_id
WHERE titleauthor.au_ord = 3 LINQ コード authors
.Join(titleauthors, a => a.au_id, t => t.au_id,
(a, t) => new{a, t}) .Where(x1 => x1.t.au_ord == 3) .Select(x1 => new
{
x1.t.au_id, x1.t.title_id, x1.t.au_ord, x1.t.royaltyper });
TopPage
ファイル名 No58_2.linq
説明 テーブルにエイリアスを付与しないでテーブル名を直接使用する
T-SQL SELECT titleauthor.*
FROM titles INNER JOIN titleauthor
ON titles.title_id = titleauthor.title_id WHERE titleauthor.au_ord = 3
LINQ コード titles
.Join(titleauthors, t => t.title_id, ti => ti.title_id, (t, ti) => new{t, ti}) .Where(x1 => x1.ti.au_ord == 3) .Select(x1 => new
{
x1.ti.au_id, x1.ti.title_id, x1.ti.au_ord, x1.ti.royaltyper });
TopPage
ファイル名 No59.linq
説明 ORDER BY 句を数値で指定する
T-SQL SELECT t1.title_id, t1.price,
(SELECT COUNT(t2.price) FROM titles AS t2
WHERE t2.price > t1.price) + 1 AS rank FROM titles AS t1
ORDER BY 3 LINQ コード titles
.Select(x1 => new {
x1.title_id, x1.price, rank = titles
.Where(x2 => x2.price > x1.price).Count(x2 => x2.price !=
null) + 1 })
.OrderBy(t => t.rank);
TopPage
ファイル名 No60.linq
説明 ORDER BY 句をカラム名で指定する(1)
T-SQL SELECT t1.title_id, t1.price,
(SELECT COUNT(t2.price) FROM titles AS t2
WHERE t2.price > t1.price) + 1 AS rank FROM titles AS t1
ORDER BY t1.title_id LINQ コード titles
.Select(x1 => new {
x1.title_id, x1.price, rank = titles
.Where(x2 => x2.price > x1.price).Count(x2 => x2.price !=
null) + 1 })
.OrderBy(t => t.title_id);
TopPage
ファイル名 No61.linq
説明 ORDER BY 句をカラム名で指定する(2)
T-SQL SELECT t1.title_id, t1.price,
(SELECT COUNT(t2.price) FROM titles AS t2
WHERE t2.price > t1.price) + 1 AS rank FROM titles as t1
ORDER BY title_id LINQ コード titles
.Select(x1 => new {
x1.title_id, x1.price, rank = titles
.Where(x2 => x2.price > x1.price).Count(x2 => x2.price !=
null) + 1 })
.OrderBy(t => t.title_id);
TopPage
ファイル名 No62.linq
説明 ORDER BY 句で選択リストに含まれないカラム名を指定する(1)
T-SQL SELECT t1.title_id, t1.price,
(SELECT COUNT(t2.price) FROM titles AS t2
WHERE t2.price > t1.price) + 1 AS rank FROM titles AS t1
ORDER BY t1.pub_id LINQ コード titles
.OrderBy(x1 => x1.pub_id) .Select(x1 => new
{
x1.title_id, x1.price, rank = titles
.Where(x2 => x2.price > x1.price).Count(x2 => x2.price !=
null) + 1 });
TopPage
ファイル名 No63.linq
説明 ORDER BY 句で選択リストに含まれないカラム名を指定する(2)
T-SQL SELECT t1.title_id, t1.price,
(SELECT COUNT(t2.price) FROM titles AS t2
WHERE t2.price > t1.price) + 1 AS rank FROM titles as t1
ORDER BY pub_id LINQ コード titles
.OrderBy(x1 => x1.pub_id) .Select(x1 => new
{
x1.title_id, x1.price, rank = titles
.Where(x2 => x2.price > x1.price).Count(x2 => x2.price !=
null) + 1 });
TopPage
ファイル名 No75.linq
説明 集合演算に ORDER BY 句を使用する
T-SQL SELECT au_id, title_id FROM titleauthor WHERE au_ord = 1 UNION
SELECT au_id, title_id FROM titleauthor WHERE au_ord <> 1 ORDER BY title_id LINQ コード titleauthors
.Where(x1 => x1.au_ord == 1) .Select(x1 => new
{
x1.au_id, x1.title_id })
.Union(titleauthors
.Where(x2 => x2.au_ord != 1) .Select(x2 => new
{
x2.au_id, x2.title_id }))
.OrderBy(t => t.title_id);