LINQPad サイト(http://www.linqpad.net/)の抄訳

LINQPad サイト(http://www.linqpad.net/)の抄訳
1 版 2010.11.06
2 版 2011.09.28
<Home/Download>のページ
時代遅れの SQL でクエリするのに疲れましたか?
よろしい!それならその必要はありません。LINQPad が最新式クエリ言語 LINQ を使って、データベー
スに対話式にクエリさせてくれます。SQL Management Studio にキスしてさよならしましょう。
LINQPad は C#4.0 と Framework4.0 の全てをサポートしています。
・LINQ to Objects
・LINQ to SQL と Entity Framework
・LINQ to XML
・並列 LINQ
これらが全てではありません。以下にもクエリすることができます。
(一部省略)
・SQL Azure, Oracle, SQLite, MySQL
・昔ながらの SQL も可能です!
LINQPad はまた LINQ を学ぶにもとても良い方法です。「C#4.0 in a Nutshell」という本からの 500 個
のサンプルとともにロードされます。LINQ のカッコよさとプログラミングを経験するのに、これ以上
いい方法はありません。
LINQPad は LINQ のツール以上のものです。それは、即時に C#や VB の式やステートメントを実行して、
よくフォーマットされた出力を表示する、人間工学的な C#/VB の走り書きのノートです。つまり、ダ
イナミックな開発における最上のものです。あなたのソースフォルダに散らばっている多くの Visual
Studio コンソールプロジェクトも終わりにしましょう。
最もよいことは、LINQPad の標準版はフリーでインストールなしで動作することです(ローインパクト
のセットアップもあります)。実行部は 3MB で、最新版に自己更新します。Google Chrome で動作する
版もあります。(画面を省略)
必要事項
・NET Framework3.5 が必要です(LINQPad4.0 なら.NET Framework4.0 が必要です)
・Visual Studio2008 か Visual C#2008Express があれば、Framework3.5 はインストール済です。
・SQL Server Express, SQL Server2000, SQL Server2005 と少し制限はありますが SQL Server2008 を
サポートします。
ライセンス
・LINQPad 標準版はフリーです。自動補完はオプションです。
・オープンソースではなく、標準の著作権で保護されています。それでも、好奇心を満たすために
逆アセンブルするのは自由です。
・著者はいかなる保証もしませんし、直接又は結果的な損害補償は受け付けません。
・詳細は「End User License Agreement」(EULA)を読んでください。(最後に記載してあります)
<FAQ>のページ
クエリに関すること
(1番目)質問:テーブルそして結合する子プロパティをなぜ複数化するのですか?これを無効にでき
ますか?
回答:結合する子プロパティを複数化することは、多くのクエリに役立つからです。(一方
結合する親プロパティは」単数です)そしてこれは、Visual Studio が型付けした Data
Context を作成する時のデフォルトです。複数化をオフするには、データベース接続を
追加する時に、[Pluralize]オプションのチェックを外してください。(もし、接続が
確立している場合は、接続プロパティを編集するために、右クリックしてください)
(2番目)質問:なぜカラム名を大文字化しているのですか?これをオフにできますか?
回答:C#のキーワードと衝突しないようにプロパティ名を大文字にしています。
無効にするには、データベース接続生成時に[Capitalize]オプションのチェック を外します。(既存の接続には、右クリックして編集してください)
(3番目)質問:なぜ大文字と小文字の区別をするのですか?SQL ではしていません。
回答:どの言語を選択するかによります。C#ではなく VB を選択すれば、大文字と小文字を
区別しません。(この時、複数行のクエリでは、'_'(アンダスコア)を忘れないでくだ
さい)直接関係のないことですが、SQL Server は大文字小文字の照合があれば、テー
ブルとカラムの名称をそれに従って扱います。
(4番目)質問:マルチステートメントの結果をどうやって表示しますか?
回答:これはサンプルで説明されています。'5-Minute Introduction'をみてください。
(5番目)質問:LINQPad2.x と LINQPad4.x の違いは何ですか?
回答:LINQPad2.x は.NET Framework3.5 上で、LINQPad4.x は.NET Framework4.0 上で動作し
ます。後者は、.NET4.0 の特長である PLINQ, TPL そして Entity Framework4.0 等に
アクセスすることができます。また、Visual Studio2010 でビルドしたアセンブリを
参照することもできます。
LINQPad2.x と LINQPad4.x を一緒に動作させることができます。これらは、独立して
自己更新します。
(6番目)質問:なぜ LINQPad は、水面下で Entity Framework ではなく、LINQ to SQL を使用するの
ですか?
回答:LINQ to SQL は大きなスキーマを使用してもより高速で、大抵はより良い SQL を発行
します。しかし自分で定義した EDM を使用して Entity Framework を使うことも
できます。SQLite や MySQL をオプションプラグインでクエリするには、LINQPad は
マット・ウォーレンのツールキットを使用します。LINQ を SQL にコンバートする
パイプラインは現在無敵です。
(7番目)質問:SQL テーブルと同様に XML データソースにクエリできますか?
回答:勿論できます。ここをクリックしてサンプルを見てください。(一部省略)
自動補完ライセンス
(1番目)質問:シングルユーザライセンスで同時に3台までの PC に使えることは分かっています。
3台まで使用したら、ライセンスを別の PC に移動することができますか?
回答:はい。1年間で6回まで移動することができます。(マルチユーザライセンスに
比例します)これをするには、[ヘルプ]メニューの[Remove Autoconpletion License]
を選んでください。もしこれを忘れたら、リモートで未使用マシンを非活性化でき
ます。
(2番目)質問:私はいつもリフォーマットしたり、Windows を再インストールしています。LINQPad の
自動補完を再アクティベートした時、元のアクティベートを上書きしますか?
回答:多くの場合 LINQPad は同じハードならばびくともしません。(もし、問題があれば、旧
マシンのアクティベートをリモートで開放することができます)
(3番目)質問:仮想マシンをアクティベートできますか?
回答:勿論できます。今のところシングルユーザーライセンスは3つの実際のアクティベート
に加えて、3つの移動可能な仮想アクティベートを付与します。(マルチユーザーライ
センスに比例します)仮想アクティベートは仮想マシンとホストマシンの両方に固定さ
れます。そして、Microsoft VPC(Windows XP モードを含む),Hyper-V そして VNWare サー
バーとワークステーションで有効です。
(4番目)質問:2ユーザライセンスを購入すれば、6台で動かせますか?
回答:はい。
(5番目)質問:チームまたはエンタープライズのライセンスがあり、LINQPad の展開を自動化したい
のですが、コマンドラインを使用して LINQPad を動作させる方法がありますか?
回答:はい。「LINQPad.exe -activate=YOUR-ACTIVATIO-CODE」としてください。
(6番目)質問:わが社の開発者は3つの市で働いています。複数の場所でチームまたはエンター
プライズライセンスは有効ですか?
回答:はい。10までの異なった場所で、1個のチームまたはエンタープライズのライセ
ンスが使用できます。
(7番目)質問:起動コードを無くしました。取り戻せますか?
回答:ここをクリックして取り戻してください。
(8番目)省略
(9番目)省略
セキュリティ
(1番目)質問:LINQPad は更新がある場合に、自動的にパッチすると思います。この更新が確実で
途中で不正が加えられていないことが、どうやって保証できますか?わが社では
セキュリティにとてもウルサイのです。
回答:LINQPad はアセンブリが正しいシグネチュアを持っている場合のみ、更新を受付ます。
つまり、オリジナルのアセンブリと公開キーが一致する時です。
(2番目)質問:SQL 認証の接続をセーブする場合、LINQPad はプレーンテキストでパスワードを格納
しますか?
回答:勿論しません。LINQPad は Windows のデータ保護 API を使用して、パスワードを
安全に暗号化します。
カスタマイズと拡張性
(1番目)質問:LINQPad にはどんな拡張ポイントがありますか?
回答:第一に、カスタムアセンブリの参照とカスタム名前空間をインポートすることが
できます([Query Properties]F4 を使ってください)。また、次に示すインタフェー
スをインプリメントすることにより、LINQPad の Dump メソッドで表示されるカスタ
ム型のフィールドとプロパティを変えられます。(具体的なインタフェースは省略)
このインタフェースをインプリメントするために、LINQPad のアセンブリを参照する
必要はありません。代わりに、このインタフェース定義を AP にコピーアンドペースト
することができます。それが LINQPad の名前空間で定義されている限り、LINQPad は
"duck-typing"経由でインタフェースを認識することができます。LINQPad では、カス
タム DataContext のドライバを書くこともできます。
(2番目)質問:LINQPad で Parallel LINQ クエリができますか?
回答:はい。LINQPad の.NET Framework4.0 バージョンをダインロードしてください。
Framework4.0 もダウンロードする必要があります。
(3番目)省略
<Purchase Autocompletion>のページ
LINQPad の自動補完
Visual Studio のインテリセンスに夢中ですか?LINQPad はオプションとしてその良さをサポートしま
す。LINQPad の自動補完はあなたが頼りにしている全てを含んでいます。
・メンバリストの表示と補完(リストフィルタリングと Camel 形式)
・引数のリスト表示
・クイック情報
・インポートする追加名前空間と参照のスマートタグ
・コードアウトライン
・.NET リフレクタ統合
・C#と LINQ コードのスニペット(プレミアム版)
自動補完は LINQ クエリだけでなく、ほとんど全ての C#3.0/4.0 で動作します。(画面を省略)
LINQPad のユニークな Power-Tick でポップアップを閉じないで、複数プロパティを選択することがで
きます。これにより、多くの時間が節約できます。(画面を省略)
未解決の型名を入力した場合には、LINQPad はすぐに全.NET Framework をスキャンし、その型名に対
する名前空間とアセンブリ参照を追加するためのスマートタグを表示します。その時、大文字小文字
を訂正する必要はありません。例えば、'protecteddata'とタイプすると、LINQPad
は'System.Security.Cryptography'名前空間をインポートするスマートタグを表示し、
'System.Security.dll'参照を追加して、'ProtectedData'と文字種を訂正します。(画面を省略)
プレミアム版を購入すれば、お好きな Visual Studio のコードスニペットを有効にすることができま
す。ユーザーの定義したカスタムスニペットと同じく、多くのユニークで高い生産性のある LINQ スニ
ペットも追加されます。(画面を省略)
プレミアム版はクロスデータベースのクエリを書く LINQPad の能力を開放します。スキーマエクスプ
ローラからクエリ上に Ctrl ボタンを押しながら、追加するデータベースをドラッグしてください。
追加マニュアルをダウンロードする必要はありません。LINQPad の[Help]メニューで[Activate
Autocompletion]をクリックして、有効化コードを入力してください。
(以下省略)
<LINQPad as a Code Scrachpad>のページ
LINQPad:最高の C#/VB 走り書きノート
LINQPad は LINQ クエリだけでなく、C#/VB の式、ステートメント、プログラムを走らせることが出来ま
す。例えば、これまでに時間のフォーマット文字列が知りたいと思ったことはありませんか?
LINQPad では、式を入力して F5 キーを押すだけです。(画面は省略)
LINQPad の即時の編集・実行とオプションの自動補完を使えば、Visual Studio の[参照の追加]ダイア
ログを持ち出すよりも少ない時間で十分なコードスニペットが手に入ります。正規表現のテストはど
うですか?LINQPad を持っていれば、より多くの Regex を使い始められます。(画面は省略)
LINQPad が Match オブジェクトをいかに良くフォーマットするかを知ってください。複合オブジェクト
のグラフは、ツリービュースタイルのデバッガよりも、LINQPad の出力ウィンドウの方がずっと見やす
いです。ステートメントを連続して実行するには、[Language]コンボボックスを[Statements]にして
ください。(画面は省略)
さあ、本当におもしろくなってきました。新しい RSA の public/private キーペアを作成しましょう。
そして、あるデータの暗号化と復号化をしましょう。(画面は省略)
繰り返しますが、望みのコードになるまで LINQPad で整えてください。それから、そのコードを
Visual Studio に貼り付ければいいのです。
[Language]を[Program]にすれば、全プログラムを動作させることもできます。その時、LINQPad は全
コードを Main メソッドでラップしますので、追加のメソッドやクラスをそこに書くことが出来ます。
カスタムアセンブリを参照する必要がありますか?問題はありません。F4 キーを押せば、ぱっと
[Additional References]が現れるのを見てください。
その他の利点は以下の通りです。
・LINQPad はステータスバーに実行時間を通知しますので、パフォーマンステストでストップ
ウォッチクラスを作る必要はありません。
・変形のスニペットをテストしたいですか?[Ctrl+Shift+C]でスニペットをコピーしますので
一緒にもうひとつのバージョンを動作させることができます。
・My Queries ツリービューにより、1クリックでセーブしたクエリに戻ることが出来ます。
ある人たちは LINQPad をスクリプトツールとして使っています。
<LINQPad + Entity Framework>のページ
Entity Framework で LINQPad を使う
LINQPad では、Visual Studio で定義した Entity Framework モデルにクエリすることができます。
ここにどう進めるかを示します。
1.Visual Studio のプロジェクトに ADO.NET Entity Data Model を作成しビルドします。
2.LINQPad の左上にある[Add Connection]をクリックし、下のリストボックスから Entity Framework を選択してください。(もし Entity Framework4.1 の Code-First を使用する場合
は、最新の LINQPad beta 版をダウンロードして、Entity Framework-POCO を選択してくだ
さい。
3.[Browse]をクリックして、1.項でビルドしたアセンブリ(EXE または DLL)をロケート
してください。(画面は省略)
4.型付けしたオブジェクトコンテキストクラスと Entity Data Model を選んでください。
(画面は省略)
5.SQL Server とデータベースの詳細を確かめて、[OK]をクリックしてください。概念モデル
が、スキーマエクスプローラに現れます。新しいクエリを開始するには、右クリックして
ください。(画面は省略)
いくつか注意点があります。
・いつでも Visual Studio に戻ってリビルドできます。LINQPad はあなたのアセンブリを
ロックしません。
・アセンブリが変更された時は、自動的にスキーマエクスプローラと自動補完キャッシュを
リフレッシュします。
・アセンブリが別のアセンブリを参照している時は、それらが同一フォルダになるように
かき集めます。
(以下省略)
<Why LINQ Beats SQL>のページ
なぜ LINQ は SQL を打ち負かすのか
LINQ 愛好者でなければ、この騒ぎは一体なんだと不思議に思うかもしれません。SQL が役に立たなく
なったわけではないのに、何を直すというのか?なぜ、もうひとつのクエリ言語が必要なのか?
一般的な答えは、LINQ が C#や VB に統合されているので、プログラミング言語とデータベースの間の
インピーダンスミスマッチを減らせ,また多くのデータソースに対して単一のクエリインタフェースを
あたえるというものです。それはそのとおりですが、それはストーリーのほんの一部に過ぎません。
より重要なことは、データベースにクエリする場合、LINQ は SQL よりは格段に生産的なクエリ言語だ
ということです。
SQL と比較すると、LINQ はよりシンプルで、より整然としていて、より高レベルです。それはむしろ
C#を C++と比較することに似ています。確かに今でも C++を使うのがベストの場合があります(SQL の場
合も同じです)。しかし、多くの状況では、現代的な整然とした言語を使い、低レベルの詳細に悩む必
要がない方が、大きな勝利を収めます。
SQL は 1974 年に考案されたとても古い言語です。それ以降、無制限に拡張されていて、再設計された
ことはありません。このことが、この言語をゴチャゴチャしたものにしています(VB6 等のように)。あ
なたは、これに慣れてしまって、何も悪いことがないように思うかもしれません。
例を見てみましょう。次のように顧客を検索する簡単なクエリを書きたいとします。
SELECT UPPER(Name)
FROM Customer
WHERE Name LIKE 'A%'
ORDER BY Name
どうですか、そんなに悪くないでしょう?さてここで、この結果が Web ページに使われて、21~3
0行を検索したいと考えてください。突然にサブクエリが必要になります。
SELECT TOP 10 UPPER(c1.Name)
FROM Customer c1
WHERE
c1.Name LIKE 'A%'
AND c1.ID NOT IN
(
SELECT TOP 20 c2.ID
FROM Customer c2
WHERE c2.Name LIKE 'A%'
ORDER BY c2.Name
)
ORDER BY c1.Name
これは複雑でゴチャゴチャしているだけでなく、DRY 原則(Don't Repeat Yourself)に反しています。
ここに LINQ での同じクエリがあります。簡潔さの利点は明白です。
var query =
from c in db.Customer
where c.Name.StartsWith("A")
orderby c.Name
select c.Name.ToUpper();
var thirdPage = query.Skip(20).Take(10);
この thirdPage を列挙する場合、LINQ to SQL(または Entity Framework)は接続している SQL Server
のバージョンに最適化して、2つのステップで構成したクエリを1つの SQL 文に翻訳します。
組み立てやすさ
LINQ へ近づくことでの、もう一つの捕らえがたいが重要な利点に気づかれたかもしれません。2つの
ステップにクエリを構成することを選ぶと、次に示すような2つ目のステップを再利用可能なメソッ
ドを作ることが出来ます。
IQueryable<T> Paginate<T> (this IQueryable<T> query, int skip, int take)
{
return query.Skip(skip).Take(take);
}
このようにできます。
var query = ...
var thirdPage = query.Paginate(20, 10);
ここで重要なことは、どのクエリにもこの Paginate メソッドが使えると言うことです。換言すれば、
LINQ でクエリを分解すれば、AP 全体にパーツのいくつかを再使用できるということです。
結合性
LINQ のもう一つの利点は、結合しなくてもリレーションシップ間でクエリすることが出来るというこ
とです。例を挙げましょう。ワシントンに住んでいる顧客で、購入総額が 1000 ドルを超えている購入
リストが欲しいとしましょう。関心を引き起こすために、私たちは購入品が項目別に分けられている
と想定します。(伝統的な購入品と購入品項目のシナリオです)そして顧客名を持たない現金売上を含
む必要があると考えます。この場合、4つのテーブル(購入品、顧客、住所、購入品項目)の結合が必
要になります。LINQ ではクエリは奮闘無用です。
from p in db.Purchases
where p.Customer.Address.State == "WA" || p.Customer == null
where p.PurchaseItems.Sum(pi => pi.SaleAmount) > 1000
select p
これを同等な SQL と比較してください。
SELECT p.*
FROM Purchase p
LEFT OUTER JOIN
Customer c INNER JOIN Address a ON c.AddressID = a.ID
ON p.CustomerID = c.ID
WHERE
(a.State = 'WA' || p.CustomerID IS NULL)
AND p.ID IN
(
SELECT PurchaseID FROM PurchaseItem
GROUP BY PurchaseID HAVING SUM (SalesAmount) > 1000
)
この例を拡張してみます。値段の低い順での購入品リストが欲しい、そして最後の射影においてセー
ルスマン名と購入品数を含めたいとします。これらの追加された評価基準を、繰り返し無しで、どの
ように自然に表現できるかに気づいてください。
from p in db.Purchases
where p.Customer.Address.State == "WA" || p.Customer == null
let purchaseValue = p.PurchaseItems.Sum(pi => pi.SaleAmount)
where purchaseValue > 1000
orderby purchaseValue descending
select new
{
p.Description,
p.Customer.SalePerson.Name,
PurchaseItemCount = p.PurchaseItems.Count()
}
以下に SQL での同じクエリを示します。
SELECT
p.Description,
s.Name,
(SELECT COUNT(*) FROM PurchaseItem pi WHERE p.ID = pi.PurchaseID) PurchaseItemCount
FROM Purchase p
LEFT OUTER JOIN
Customer c
INNER JOIN Address a ON c.AddressID = a.ID
LEFT OUTER JOIN SalesPerson s ON c.SalesPersonID = s.ID
ON p.CustomerID = c.ID
WHERE
(a.State = 'WA' || p.CustomerID IS NULL)
AND p.ID IN
(
SELECT PurchaseID FROM PurchaseItem
GROUP BY PurchaseID HAVING SUM (SalesAmount) > 1000
)
ORDER BY
(SELECT SUM (SaleAmount) FROM PurchaseItem pi WHERE p.ID = pi.PurchaseID) DESC
上記 SQL クエリを LINQ に書き直すことができるというのは興味ある点です。この場合クエリはまった
く繰り返しの多い、少なくても出来の悪いクエリを生成します。フォーラムに投稿されたこのような
非実用的なクエリをしばしば見かけるでしょう。これは LINQ で考えるのではなく、SQL で考えた結果
として起きることです。これは初期の BASIC で書かれたプログラムを VB.NET や C#4 に書き直すことに
似ています。
そして GOTO 文のような不出来なシンタックスに文句を言うのです。
データの形を整える
SQL ではクエリは平面的な結果の集合として返ります。しかしながら、しばしばそれは階層的データと
して扱う便利さからは程遠いものです。例を挙げましょう。顧客を彼らの高額購入品と一緒に検索し
たいとします。LINQ では、これを単純化できます。
from c in db.Customers
where c.Address.State == "WA"
select new
{
c.Name,
HighValuePurchases = c.Purchases.where(p => p.Price > 1000)
}
ここで、HighValuePurchases はコレクションです。結合プロパティのクエリをしているので、結合は
必要ないことに注意してください。内部結合か外部結合かを気にする必要もありません。LINQ がこの
詳細を抽象化してくれるのです。この場合、サブコレクションがゼロ要素を返すので、LINQ が行を排
除することはないため、左外部結合に翻訳されます。内部結合に翻訳されるのが見たいなら、次のよ
うにします。
from c in db.Customers
where c.Address.State == "WA"
let HighValuePurchases = c.Purchases.Where(p => p.Price > 1000)
where HighValuePurchases.Any()
select new
{
c.Name,
HighValuePurchases
}
LINQ は平面的な外部結合、アドホック結合、サブクエリそして豊富な演算子を使った多くのクエリも
サポートします。
パラメータ化
州名"WA"が変数で与えられるように、前の例をパラメータ化するには、このようにします。
string state = "WA";
var query =
from c in db.Customers
where c.Address.State == state
...
DbCommand オブジェクトのパラメータのようにゴチャゴチャしていないし、SQL インジェクションの心
配もありません。LINQ のパラメータ化はインラインでタイプセーフで読みやすい。正確に言うと問題
を解決してくれる訳ではありませんが、上手に解決してくれます。
LINQ クエリは組み合わせが出来るので、条件的に論理述語を追加することができます。例えば、以下
のようにメソッドを書いたとします。
IQueryable<Customer> GetCustomers (string state, decimal? minPurchase)
{
var query = Customers.AsQueryable();
if (state != null)
query = query.Where (c => c.Address.State == "WA");
if (minPurchase != null)
query = query.Where (c => c.Purchases.Any (p => p.Price > minPurchase.Value));
return query;
}
もし、このメソッドの state と minPurchase を null にして呼び出すと、以下に示す SQL が結果を列挙
する時に生成されます。
SELECT [t0].[ID], [t0].[Name], [t0].[AddressID]
FROM [Customer] AS [t0]
しかし、もし state と minPurchase に値を与えれば、LINQ to SQL はクエリに論理述語を追加するだけ
でなく、必要な結合も追加します
SELECT [t0].[ID], [t0].[Name], [t0].[AddressID]
FROM [Customer] AS [t0]
LEFT OUTER JOIN [Address] AS [t1] ON [t1].[ID] = [t0].[AddressID]
WHERE (EXISTS(
SELECT NULL AS [EMPTY]
FROM [Purchase] AS [t2]
WHERE ([t2].[Price] > @p0) AND ([t2].[CustomerID] = [t0].[ID])
)) AND ([t1].[State] = @p1)
このメソッドは IQueryable を戻すので、実際には SQL に変換される訳ではなく、列挙されるまでラン
します。このことは、呼び出し側がさらに論理述語やページング、カスタム射影などを追加できる機
会を与えます。
スタティック型の安全性
前出のクエリで、state 変数を文字列でなく整数で宣言すれば、実行する前にコンパイルエラーになり
ます。同じことがテーブル名やカラム名を間違った時にも言えます。これはリファクタリング時に本
当に役立ちます。コンパイラが仕事をきちんとやっていないと教えてくれる訳です。
クライアント処理
LINQ は何もしなくても、クエリの一部をクライアント処理に移動します。何のためでしょうか?
重い負荷がかかったデータベースサーバーでは、このことが現実に時々パフォーマンスを改善します。
あなたが必要なデータ以外を受けない限り(換言すればデータベースで全てのフィルタリングをする限
り)、順序付けや結果のグループ化を、より負荷の少ない AP サーバーに移動すれば、しばしばパフォー
マンスを上げることができます。LINQ では、クエリに AsEnumerable()をもぐり込ませば、そこから全
てがローカルで実行されます。
LINQ を使用しない場合
そのパワーに関わらず、LINQ は SQL に異を唱えるものではありません。LINQ はクエリの 95%を占めま
すが、以下のような場合には SQL が必要になります。
・手作りクエリ(特に最適化など)
・一時テーブルへの SELECT を含むクエリ
・述語を使った UPDATE と大量の INSERT
勿論トリガでは SQL が必要です。(ストアドプロシージャやストアドファンクションでも SQL が必要で
す。ただ、LINQ を使えば、これらの必要性も少なくなるでしょう)。LINQ と SQL を結合することができ
ます。それには、SQL でテーブルを返す関数を書いて、手の込んだ LINQ クエリでこの関数を呼び出し
ます。
2つのクエリ言語を知らなければならないことは論点ではありません。なぜなら、いずれにせよ LINQ
を学びたくなるからです。LINQ はローカルコレクションや XML への問い合わせにも役立ちます。もし、
古い XmlDocument ベースの DOM をまだ使っているとしたら、LINQ to XML の DOM が劇的なステップアッ
プだと分かるでしょう。
そして LINQ は SQL よりもマスタしやすいので、本当に良いクエリを書くという目的は、SQL よりも
LINQ の方がより達成しやすいでしょう。
現場での LINQ to SQL
アドホッククエリの場合は、私は専ら LINQ を使います。ただ単に生産的だからです。アプリケーショ
ンを書く場合、個人的な経験では LINQ to SQL や Entity Framework の API を使用した、LINQ 化された
データアクセス層は開発時間を半分以上カットします。同様にメンテナンス性をはるかに向上させま
す。
<Mastering LINQ>のページ
LINQ を習得する
あなたの方法が合っていると感じていることは大きな間違いです。SQL クエリを LINQ に書き直すとひ
どい結果に終わりるでしょう。クエリ言語を正しく学ぶ時間を少しとれば、大きな配当があるでしょ
う。LINQ は SQL よりも見返りの大きい学習カーブを持っています。基礎を学ぶのにより長い時間がか
かる一方で、習得するのにはより短い時間で済みます。LINQ は SQL を悩ます微妙な差異からまったく
自由であり、高水準クエリ言語と考えられています。
書籍は学ぶには優れた方法です。あなたが中級以上の開発者で、急いでいるのであれば、「LINQ
Pocket Reference」が、クエリに有能であるために必要な全てを手早く教えてくれます。この小さな
本は LINQPad の作者が書いていて、「C#3.0 in a Nutshell」から引用されています。以下の項目を網
羅しています。
・クエリシンタックス
・クエリ演算子
・ローカルコレクションとデータベースへのクエリ
・LINQ to XML
・クエリとメソッドの混在
・結合とサブクエリの実行
この本を午後にでも読んでください。この本の全サンプルは LINQPad にロード済みですので、色々動
かしてください。それほど簡単ではありませんが!
(以下省略)
<EULA : End User License Agreement>のページ
ジョーゼフ・アルバリ(許可権所有者)は、あなた(免許所有者)に LINQPad を個人的にも商業的にも使
用することのできるオープンなライセンスを容認します。許可権所有者は LINQPad の全知的所有権を
保持します。
<使用に関して>
あなたは許可権所有者からの許可書なしに、公開されたウェブサイト経由で LINQPad を再配布するこ
とはできません。あなたは、LINQPad への修正を作成しても配布してもいけません。また、LINQPad を
再ライセンスすることはできませんし、www.linqpad.net の製品ページに記載してある自動補完ライセ
ンス使用の制限を妨げてもいけません。
<情報コレクション>
LINQPad は自動的に Web サーバと通信します。
・更新のチェックと更新検索を行う時
・フィードバックとエラー報告を行う時(免許所有者が選択時)
・自動補完ライセンス時
LINQPad は処理を適切に実行するために、最小限のデータしか送りません。
<否認事項>
LINQPad は、明示されたものも暗黙的なものも含むいかなる種類の保証もなく提供されています。許可
権所有者は、どのような場合でも、どんな損害にも責任がありません。これらに限りませんが、直接
的な、間接的な、特殊な、偶発的な、結果的な損害や使用することによって発生する損失や製品の使
用不能などが考えられます。