SQLCompiler for LINQ(C#) のサンプル (LINQPad 用 LINQ to Entities 基本サンプル ) 本サンプルで使用した Visual Studio プロジェクトの pubs データベースの概念モデルは 以下のテーブル名とカラム名が 直接 SQL Sever へクエリする場合と異なるので が補正されています テーブル名が異なるもの employee employees royshed roysheds titleauthor カラム名が異なるもの discounts.discount discounts.discount1 titles.title titles.title1 Northwind データベースについては 本サンプルで使用しているテーブル名とカラム名は 概念モデルと一致しています < 一覧表 > リンク 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 1
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 2
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 単一テーブルを使用する SELECT TOP 10 au_lname, au_fname FROM authors WHERE au_id = '172-32-1176' authors.where(x1 => x1.au_id == "172-32-1176") x1.au_lname, x1.au_fname }).Take(10); No2.linq 2 つのテーブルのクロス結合を使用する SELECT t2.au_id, t1.au_lname FROM authors AS t1, AS t2 WHERE t1.au_id = t2.au_id authors.selectmany(t2 =>, (t1, t2) => newt1, t2}).where(x1 => x1.t1.au_id == x1.t2.au_id) x1.t2.au_id, 3
x1.t1.au_lname No3.linq 2 つのテーブルの内部結合を使用する SELECT t2.au_id, t1.au_lname FROM authors AS t1 INNER JOIN AS t2 ON t1.au_id = t2.au_id authors.join(, t1 => t1.au_id, t2 => t2.au_id, (t1, t2) => newt1, t2}) x1.t2.au_id, x1.t1.au_lname No4.linq No3.linq で GROUP BY 句, ORDER BY 句, COUNT(*) を使用する SELECT t2.au_id, COUNT(*) FROM authors AS t1 INNER JOIN AS t2 ON t1.au_id = t2.au_id GROUP BY t2.au_id ORDER BY t2.au_id DESC authors.join(, t1 => t1.au_id, t2 => t2.au_id, (t1, t2) => newt1, t2}).groupby(x1 => newgrkey1 = x1.t2.au_id}).select(g1 => new au_id = g1.key.grkey1, root_alias_2 = g1.count() }).OrderByDescending(t => t.au_id); 4
No5.linq 二項演算子 (+) を使用する SELECT au_lname + '-' + au_fname AS au_name FROM authors WHERE au_id = '172-32-1176' authors.where(x1 => x1.au_id == "172-32-1176") au_name = x1.au_lname + "-" + x1.au_fname No6.linq 単純 CASE 式を使用する 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 AS t2 ON t1.au_id = t2.au_id GROUP BY t2.au_id authors.join(, t1 => t1.au_id, t2 => t2.au_id, (t1, t2) => newt1, t2}).groupby(x1 => newgrkey1 = x1.t2.au_id}).select(g1 => new au_id = g1.key.grkey1, kosu = (g1.count() == 1? "one" : g1.count() == 2? "two" : "over") No7.linq 検索 CASE 式を使用する SELECT t2.au_id, CASE WHEN COUNT(*) <= 2 THEN 'onetwo' ELSE 'over' END AS kosu FROM authors AS t1 INNER JOIN AS t2 ON t1.au_id = t2.au_id GROUP BY t2.au_id 5
authors.join(, t1 => t1.au_id, t2 => t2.au_id, (t1, t2) => newt1, t2}).groupby(x1 => newgrkey1 = x1.t2.au_id}).select(g1 => new au_id = g1.key.grkey1, kosu = (g1.count() <= 2? "onetwo" : "over") No8.linq 単項演算子と括弧式を使用する SELECT au_id, -(au_ord + royaltyper) AS var FROM WHERE au_id = '172-32-1176'.Where(x1 => x1.au_id == "172-32-1176") x1.au_id, var = -(x1.au_ord + x1.royaltyper) No9.linq 検索条件に括弧を使用する SELECT au_id FROM 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).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)) 6
x1.au_id No10.linq 検索条件に NOT を使用する SELECT au_id FROM WHERE (NOT au_id = '172-32-1176' AND NOT (au_ord = 3 OR au_ord = 1) AND NOT royaltyper = 40).Where(x1 => (!(x1.au_id == "172-32-1176") &&!(x1.au_ord == 3 x1.au_ord == 1) &&!(x1.royaltyper == 40))) x1.au_id No11.linq 数値 ( 小数 ) リテラルを使用する SELECT au_id, au_ord + 1.1 AS goukei FROM WHERE au_id = '172-32-1176'.Where(x1 => x1.au_id == "172-32-1176") x1.au_id, goukei = x1.au_ord + 1.1 No12.linq GROUP BY 句と AVG 関数を使用する SELECT au_ord, AVG(royaltyper) AS heikin FROM GROUP BY au_ord.groupby(x1 => newgrkey1 = x1.au_ord}) 7
.Select(g1 => new au_ord = g1.key.grkey1, heikin = g1.average(x1 => x1.royaltyper) No13.linq No12.linq の AVG 関数に DISTINCT を使用する SELECT au_ord, AVG(DISTINCT royaltyper) AS heikin FROM GROUP BY au_ord.groupby(x1 => newgrkey1 = x1.au_ord}).select(g1 => new au_ord = g1.key.grkey1, heikin = g1.select(x1 => (int?)(x1.royaltyper)).distinct().average() No14.linq GROUP BY 句と COUNT 関数を使用する SELECT au_ord, COUNT(au_ord) AS kosuu FROM GROUP BY au_ord.groupby(x1 => newgrkey1 = x1.au_ord}).select(g1 => new au_ord = g1.key.grkey1, kosuu = g1.count(x1 => g1.key.grkey1!= null) No15.linq No14.linq の COUNT 関数に DISTINCT を使用する SELECT au_ord, COUNT(DISTINCT royaltyper) AS kosuu FROM GROUP by au_ord 8
.GroupBy(x1 => newgrkey1 = x1.au_ord}).select(g1 => new au_ord = g1.key.grkey1, kosuu = g1.where(x1 => x1.royaltyper!= null).select(x1 => x1.royaltyper).distinct().count() No16.linq FROM 句でサブクエリを使用する SELECT t2.au_id, t2.au_lname + ' ' + t2.au_fname AS namae, t1.royaltyper FROM (SELECT au_id, royaltyper FROM WHERE royaltyper = 100) AS t1 INNER JOIN authors AS t2 ON t1.au_id = t2.au_id.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) => newt1, t2}) x1.t2.au_id, namae = x1.t2.au_lname + " " + x1.t2.au_fname, x1.t1.royaltyper No17.linq WHERE 句でサブクエリを使用する SELECT t1.au_id FROM 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' 9
.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)) x1.au_id No17_2.linq No17.linq と等価な SQL を IN 限定子を使用して作成する SELECT t1.au_id FROM 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).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)) x1.au_id LINQ コード No18.linq HAVING 句でサブクエリを使用する SELECT stor_id GROUP BY stor_id HAVING AVG(qty) > (SELECT AVG(qty) WHERE payterms = 'Net 30' GROUP BY payterms) /* LINQ to Entities では SingleOrDefault() は使用できないので 10
FirstOrDefault() を使用する */ sales.groupby(x1 => newgrkey1 = 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))).firstordefault()).select(g1 => new stor_id = g1.key.grkey1 LINQ コード No19.linq 選択リストでサブクエリを使用する SELECT stor_id, qty - (SELECT AVG(qty) WHERE stor_id = '7067' GROUP BY stor_id) AS diff WHERE stor_id = '7067' /* LINQ to Entities では SingleOrDefault() は使用できないので FirstOrDefault() を使用する */ sales.where(x1 => x1.stor_id == "7067") x1.stor_id, diff = x1.qty - sales.where(x2 => x2.stor_id == "7067").GroupBy(x2 => newgrkey1 = x2.stor_id}).select(g1 => g1.average(x2 => (int?)(x2.qty))).firs tordefault() LINQ コード No20.linq LIKE 限定子を使用する SELECT au_id, title_id FROM WHERE title_id LIKE 'PS%' /* LINQ to Entities では System.Data.Linq.SqlClient.SqlMethods.Like() は使用できないので StartsWith() を使用する */ 11
.Where(x1 => (x1.title_id).startswith( "PS")) x1.au_id, x1.title_id LINQ コード No21.linq No20.linq で NOT LIKE 限定子を使用する SELECT au_id, title_id FROM WHERE title_id NOT LIKE 'PS%' /* LINQ to Entities では System.Data.Linq.SqlClient.SqlMethods.Like() は使用できないので StartsWith() を使用する */.Where(x1 =>!((x1.title_id).startswith("ps"))) x1.au_id, x1.title_id LINQ コード No22.linq No21.linq の述語全体を否定する SELECT au_id, title_id FROM WHERE NOT title_id NOT LIKE 'PS%' /* LINQ to Entities では System.Data.Linq.SqlClient.SqlMethods.Like() は使用できないので StartsWith() を使用する */.Where(x1 => (x1.title_id).startswith("ps")) x1.au_id, x1.title_id No23.linq BETWEEN 限定子を使用する SELECT au_id, royaltyper 12
FROM WHERE royaltyper BETWEEN 75 AND 100.Where(x1 => x1.royaltyper >= 75 && x1.royaltyper <= 100) x1.au_id, x1.royaltyper No24.linq No23.linq で NOT BETWEEN 限定子を使用する SELECT au_id, royaltyper FROM WHERE royaltyper NOT BETWEEN 75 AND 100.Where(x1 =>!(x1.royaltyper >= 75 && x1.royaltyper <= 100)) x1.au_id, x1.royaltyper No25.linq No24.linq の述語全体を否定する SELECT au_id, royaltyper FROM WHERE NOT royaltyper NOT BETWEEN 75 AND 100.Where(x1 => x1.royaltyper >= 75 && x1.royaltyper <= 100) x1.au_id, x1.royaltyper No26.linq IS NULL 限定子を使用する 13
SELECT title_id FROM titles WHERE price IS NULL titles.where(x1 => x1.price == null) x1.title_id No27.linq No26.linq で IS NOT NULL 限定子を使用する SELECT title_id FROM titles WHERE price IS NOT NULL titles.where(x1 =>!(x1.price == null)) x1.title_id No28.linq No27.linq の述語全体を否定する SELECT title_id FROM titles WHERE NOT price IS NOT NULL titles.where(x1 => x1.price == null) x1.title_id No29.linq IN 限定子を使用する SELECT au_ord 14
FROM WHERE au_ord IN (2,3).Where(x1 => (new int?[]2, 3}).Contains(x1.au_ord)) x1.au_ord No30.linq No29.linq で NOT IN 限定子を使用する SELECT au_ord FROM WHERE au_ord NOT IN (2,3).Where(x1 =>!((new int?[]2, 3}).Contains(x1.au_ord))) x1.au_ord No31.linq No30.linq の述語全体を否定する SELECT au_ord FROM WHERE NOT au_ord NOT IN (2,3).Where(x1 => (new int?[]2, 3}).Contains(x1.au_ord)) x1.au_ord No32.linq EXISTS 限定子を使用する SELECT t1.title_id FROM titles AS t1 15
WHERE EXISTS (SELECT * FROM AS t2 WHERE t1.title_id = t2.title_id AND t2.au_ord = 3) titles.where(x1 =>.Any(x2 => x1.title_id == x2.title_id && x2.au_ord == 3)) x1.title_id No33.linq No32.linq を NOT EXISTS 限定子にする SELECT t1.title_id FROM titles AS t1 WHERE NOT EXISTS (SELECT * FROM AS t2 WHERE t1.title_id = t2.title_id AND t2.au_ord = 3) titles.where(x1 =>!(.Any(x2 => x1.title_id == x2.title_id && x2.au_ord == 3))) x1.title_id No34.linq ALL 限定子を使用する SELECT stor_id GROUP BY stor_id HAVING AVG(qty) >= ALL (SELECT AVG(qty) GROUP BY payterms) sales.groupby(x1 => newgrkey1 = x1.stor_id}).where(g1 => sales.groupby(x2 => new grkey2 = x2.payterms}).select(g2 => new 16
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 No35.linq No34.linq を NOT ALL 限定子にする SELECT stor_id GROUP BY stor_id HAVING NOT AVG(qty) >= ALL (SELECT AVG(qty) GROUP BY payterms) sales.groupby(x1 => newgrkey1 = 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 No36.linq ANY 限定子を使用する SELECT stor_id GROUP BY stor_id HAVING AVG(qty) >= ANY (SELECT AVG(qty) GROUP BY payterms) sales.groupby(x1 => newgrkey1 = x1.stor_id}).where(g1 => sales.groupby(x2 => new grkey2 = x2.payterms}).select(g2 => new 17
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 No37.linq No36.linq で NOT ANY 限定子を使用する SELECT stor_id GROUP BY stor_id HAVING NOT AVG(qty) >= ANY (SELECT AVG(qty) GROUP BY payterms) sales.groupby(x1 => newgrkey1 = 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 No38.linq IN 限定子を使用する SELECT stor_id, qty WHERE qty IN (SELECT qty WHERE payterms = 'ON invoice') sales.where(x1 => sales.where(x2 => x2.payterms == "ON invoice").select(x2 => new x2.qty 18
}).Any(t => x1.qty == t.qty)) x1.stor_id, x1.qty No39.linq No38.linq で NOT IN 限定子を使用する SELECT stor_id, qty WHERE qty NOT IN (SELECT qty WHERE payterms = 'ON invoice') sales.where(x1 => sales.where(x2 => x2.payterms == "ON invoice").select(x2 => new x2.qty }).All(t => x1.qty!= t.qty)) x1.stor_id, x1.qty No40.linq No39.linq の述語全体を否定する SELECT stor_id, qty WHERE NOT qty IN NOT (SELECT qty WHERE payterms = 'ON invoice') sales.where(x1 =>!(sales.where(x2 => x2.payterms == "ON invoice").select(x2 => new x2.qty }).All(t => x1.qty!= t.qty))) 19
x1.stor_id, x1.qty No43.linq 自己結合を使用する 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 stores.selectmany(t2 => stores, (t1, t2) => newt1, t2}).where(x1 => string.compare(x1.t1.stor_id,x1.t2.stor_id) < 0) store1 = x1.t1.stor_id, store2 = x1.t2.stor_id No45.linq 集合演算を FROM 句で使用する 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 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 WHERE royaltyper <> 100 ) AS t1 INNER JOIN authors AS t2 ON t1.au_id = t2.au_id ) t3 ORDER BY t3.r1.where(x3 => x3.royaltyper == 100) 20
.Select(x3 => new x3.au_id, x3.royaltyper }).Join(authors, t1 => t1.au_id, t2 => t2.au_id, (t1, t2) => newt1, t2}).select(x2 => new x2.t2.au_id, namae1 = x2.t2.au_lname + " " + x2.t2.au_fname, r1 = x2.t1.royaltyper }).Union(.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) => newt1, t2}).select(x4 => new x4.t2.au_id, namae1 = x4.t2.au_lname + " " + x4.t2.au_fname, r1 = x4.t1.royaltyper })) x1.au_id, x1.namae1, x1.r1 }).OrderBy(t => t.r1); No46.linq 集合演算を WHERE 句で使用する SELECT t1.au_id FROM AS t1 WHERE ( SELECT t2.au_id FROM authors AS t2 WHERE t1.au_id = t2.au_id AND t1.royaltyper = 100 21
UNION SELECT t2.au_id FROM authors AS t2 WHERE t1.au_id = t2.au_id AND t1.royaltyper <> 100 ) = '172-32-1176'.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)) x1.au_id No46_2.linq No46.linq の WHERE 句で IN 限定子を使用する SELECT t1.au_id FROM 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).Where(x1 => authors.where(x2 => x1.au_id == x2.au_id && x1.royaltyper == 100).Select(x2 => new x2.au_id }) 22
!= 100) x1.au_id.union(authors.where(x3 => x1.au_id == x3.au_id && x1.royaltyper.select(x3 => new x3.au_id })).Any(t => "172-32-1176" == t.au_id)) No47.linq 集合演算を選択リストで使用する SELECT t1.au_ord, t1.royaltyper - ( SELECT AVG(royaltyper) FROM AS t1 WHERE t1.au_ord = 1 GROUP BY t1.au_ord UNION SELECT AVG(royaltyper) FROM AS t1 WHERE t1.au_ord = 1 GROUP BY t1.au_ord) AS diff FROM AS t1 WHERE au_ord = 1 LINQ コード /* LINQ to Entities では SingleOrDefault() は使用できないので FirstOrDefault() を使用する */.Where(x1 => x1.au_ord == 1) x1.au_ord, diff = x1.royaltyper -.Where(x2 => x2.au_ord == 1).GroupBy(x2 => newgrkey1 = x2.au_ord}).select(g1 => g1.average(x2 => x2.royaltyper)).union(.where(x3 => x3.au_ord == 1).GroupBy(x3 => newgrkey2 = x3.au_ord}).select(g2 => g2.average(x3 => x3.royaltyper))).firstordefault() 23
No48.linq 集合演算をルートクエリで使用する SELECT au_id, title_id FROM WHERE au_ord = 1 UNION SELECT au_id, title_id FROM WHERE au_ord <> 1.Where(x1 => x1.au_ord == 1) x1.au_id, x1.title_id }).Union(.Where(x2 => x2.au_ord!= 1).Select(x2 => new x2.au_id, x2.title_id })); No49.linq ビット型を FROM 句で使用する SELECT a.au_id, t.title_id FROM authors AS a INNER JOIN AS t ON a.au_id = t.au_id AND a.contract = 1 authors.join(, a => newa.au_id, key1 = a.contract}, t => newt.au_id, key1 = (1 == 0? false : true)}, (a, t) => newa, t}) x1.a.au_id, x1.t.title_id No50.linq 24
No49.linq の 2 つ目の結合キーの左辺と右辺を入れ替える SELECT a.au_id, t.title_id FROM authors AS a INNER JOIN AS t ON a.au_id = t.au_id AND 1 = a.contract authors.join(, a => newa.au_id, key1 = a.contract}, t => newt.au_id, key1 = (1 == 0? false : true)}, (a, t) => newa, t}) x1.a.au_id, x1.t.title_id No50_2.linq No50.linq の 2 つ目の結合キーを WHEHE 句に移動する SELECT a.au_id, t.title_id FROM authors AS a INNER JOIN AS t ON a.au_id = t.au_id WHERE 1 = a.contract authors.join(, a => a.au_id, t => t.au_id, (a, t) => newa, t}).where(x1 => (1 == 0? false : true) == x1.a.contract) x1.a.au_id, x1.t.title_id No51.linq ビット型を WHERE 句で使用する SELECT a.au_id, t.title_id FROM authors AS a INNER JOIN AS t ON a.au_id = t.au_id WHERE a.contract = 1 25
authors.join(, a => a.au_id, t => t.au_id, (a, t) => newa, t}).where(x1 => x1.a.contract == (1 == 0? false : true)) x1.a.au_id, x1.t.title_id No52.linq ビット型を選択リストで使用する SELECT a.au_id, a.contract, t.title_id FROM authors AS a INNER JOIN AS t ON a.au_id = t.au_id AND a.state = 'UT' authors.join(, a => newa.au_id, key1 = a.state}, t => newt.au_id, key1 = "UT"}, (a, t) => newa, t}) x1.a.au_id, x1.a.contract, x1.t.title_id LINQ コード No53.linq 時間型を FROM 句で使用する SELECT t1.title_id, t2.au_id FROM titles AS t1 INNER JOIN AS t2 ON t1.title_id = t2.title_id AND t1.pubdate > '2000-01-01' /* LINQ to Entities では Parse メソッドは使用できないため DateTime コンストラクタを使用する */ titles.selectmany(t2 =>, (t1, t2) => newt1, t2}).where(x1 => x1.t1.title_id == x1.t2.title_id && x1.t1.pubdate > new DateTime(2000, 01, 01)) 26
x1.t1.title_id, x1.t2.au_id LINQ コード No54.linq 時間型を WHERE 句で使用する SELECT t1.title_id, t2.au_id FROM titles AS t1 INNER JOIN AS t2 ON t1.title_id = t2.title_id WHERE t1.pubdate > '2000-01-01' /* LINQ to Entities では Parse メソッドは使用できないため DateTime コンストラクタを使用する */ titles.join(, t1 => t1.title_id, t2 => t2.title_id, (t1, t2) => newt1, t2}).where(x1 => x1.t1.pubdate > new DateTime(2000, 01, 01)) x1.t1.title_id, x1.t2.au_id No55_2.linq 時間型を選択リストで使用する (1) SELECT t1.title_id, t1.pubdate, t2.au_id FROM titles AS t1 INNER JOIN AS t2 ON t1.title_id = t2.title_id WHERE t2.au_ord = 3 titles.join(, t1 => t1.title_id, t2 => t2.title_id, (t1, t2) => newt1, t2}).where(x1 => x1.t2.au_ord == 3) x1.t1.title_id, x1.t1.pubdate, x1.t2.au_id 27
No55_3.linq 時間型を選択リストで使用する (2) SELECT t1.title_id, t1.pubdate, t2.au_id FROM titles AS t1 INNER JOIN AS t2 ON t1.title_id = t2.title_id AND t1.royalty = t2.au_ord * 10 titles.join(, t1 => newt1.title_id, key1 = t1.royalty}, t2 => newt2.title_id, key1 = t2.au_ord * 10}, (t1, t2) => newt1, t2}) x1.t1.title_id, x1.t1.pubdate, x1.t2.au_id No55_5.linq 時間型を選択リストで使用する (3) SELECT t1.title_id, t1.pubdate, t1.pubdate + 1 FROM titles AS t1 INNER JOIN AS t2 ON t1.title_id = t2.title_id AND t1.royalty = t2.au_ord * 10 LINQ コード /* LINQ to Entities では TimeSpan.FromDays() は使用できないので System.Data.Objects.SqlClient.SqlFunctions.DateAdd() を使用する */ titles.join(, t1 => newt1.title_id, key1 = t1.royalty}, t2 => newt2.title_id, key1 = t2.au_ord * 10}, (t1, t2) => newt1, t2}) x1.t1.title_id, x1.t1.pubdate, root_alias_3 = System.Data.Objects.SqlClient.SqlFunctions.DateAdd( "day", (double) +1, x1.t1.pubdate) 28
No56_2.linq 選択リストで リレーションエイリアス.* を指定する SELECT t.* FROM authors AS a INNER JOIN AS t ON a.au_id = t.au_id WHERE t.au_ord = 3 authors.join(, a => a.au_id, t => t.au_id, (a, t) => newa, t}).where(x1 => x1.t.au_ord == 3) x1.t.au_id, x1.t.title_id, x1.t.au_ord, x1.t.royaltyper No57_2.linq 選択リストで テーブル名.* を指定する SELECT titleauthor.* FROM authors INNER JOIN ON authors.au_id =.au_id WHERE.au_ord = 3 authors.join(, a => a.au_id, t => t.au_id, (a, t) => newa, t}).where(x1 => x1.t.au_ord == 3) x1.t.au_id, x1.t.title_id, x1.t.au_ord, x1.t.royaltyper No58_2.linq テーブルにエイリアスを付与しないでテーブル名を直接使用する 29
SELECT titleauthor.* FROM titles INNER JOIN ON titles.title_id =.title_id WHERE.au_ord = 3 titles.join(, t => t.title_id, ti => ti.title_id, (t, ti) => newt, ti}).where(x1 => x1.ti.au_ord == 3) x1.ti.au_id, x1.ti.title_id, x1.ti.au_ord, x1.ti.royaltyper No59.linq ORDER BY 句を数値で指定する 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 titles x1.title_id, x1.price, rank = titles.where(x2 => x2.price > x1.price).count(x2 => x2.price!= null) + 1 }).OrderBy(t => t.rank); No60.linq ORDER BY 句をカラム名で指定する (1) SELECT t1.title_id, t1.price, (SELECT COUNT(t2.price) FROM titles AS t2 30
WHERE t2.price > t1.price) + 1 AS rank FROM titles AS t1 ORDER BY t1.title_id titles x1.title_id, x1.price, rank = titles.where(x2 => x2.price > x1.price).count(x2 => x2.price!= null) + 1 }).OrderBy(t => t.title_id); No61.linq ORDER BY 句をカラム名で指定する (2) 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 titles x1.title_id, x1.price, rank = titles.where(x2 => x2.price > x1.price).count(x2 => x2.price!= null) + 1 }).OrderBy(t => t.title_id); No62.linq ORDER BY 句で選択リストに含まれないカラム名を指定する (1) 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 31
titles.orderby(x1 => x1.pub_id) x1.title_id, x1.price, rank = titles.where(x2 => x2.price > x1.price).count(x2 => x2.price!= null) + 1 No63.linq ORDER BY 句で選択リストに含まれないカラム名を指定する (2) 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 titles.orderby(x1 => x1.pub_id) x1.title_id, x1.price, rank = titles.where(x2 => x2.price > x1.price).count(x2 => x2.price!= null) + 1 No75.linq 集合演算に ORDER BY 句を使用する SELECT au_id, title_id FROM WHERE au_ord = 1 UNION SELECT au_id, title_id FROM WHERE au_ord <> 1 ORDER BY title_id.where(x1 => x1.au_ord == 1) 32
x1.au_id, x1.title_id }).Union(.Where(x2 => x2.au_ord!= 1).Select(x2 => new x2.au_id, x2.title_id })).OrderBy(t => t.title_id); 33