web-dev-qa-db-ja.com

LinqPad-SQLからLinqへの変換コマンド

最近、SQLステートメントをLINQステートメントに変換できるように、LINQPadを購入しました。

LINQPadを使用して、DBを接続し、必要な結果を返すSQLステートメントを実行できます。

しかし、そのSQLステートメントをLINQに変換する「コマンド」が見つかりません。

LINQPad OR別のツールを使用してSQLをLINQに変換する方法を教えてください。

14
Ravi Ram

一般に、@ andres-abelが言及したようにSQLをLinqに変換するツールはありませんが、指定されたSQLを正確に実行するLinqを作成する必要がある場合があります(たとえば、パフォーマンスの問題、下位互換性、またはその他の理由)。

この場合、自分でリバースエンジニアリングを行うことをお勧めします

  1. linqによって生成されたダンプSQLステートメントのロギングを、を使用してstdoutに設定します
  2. 必要なものが得られるまで、Linqステートメントを手動で書き換えます
8
Akim

Linqer と呼ばれるツールがありますが、注意してください。SQLからLINQに音訳すると、 最悪の両方の世界 が得られます。

たとえば、現金で、またはワシントンに住んでいる顧客によって、1000ドル以上のすべての購入を支払いたいとします。 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 (SaleAmount) > 1000
    )

これをどのようにLINQに翻訳しますか?間違った方法は、クエリをLINQにtransliterateして、外部結合と内部結合、サブクエリ、およびグループ句を再現しようとすることです。正しい方法は、元のクエリ(英語)を直接LINQにマッピングし、LINQの線形のデータフローと関連付けプロパティを活用することです。

すべての購入が必要です...

from p in db.Purchases

... $ 1000以上...

where p.PurchaseItems.Sum (pi => pi.SaleAmount) > 1000

...現金で支払い...

where p.Customer == null

...またはワシントンに住んでいる顧客による

|| p.Customer.Address.State == "WA"

最終的なクエリは次のとおりです。

from p in db.Purchases
where p.PurchaseItems.Sum (pi => pi.SaleAmount) > 1000
where p.Customer == null || p.Customer.Address.State == "WA"
select p

詳細 こちら

45
Joe Albahari

LinqPadには、SQL-> LINQトランスレーターが含まれていません。 LinqPadには実際にはLINQ-> SQLトランスレーターも含まれていません。翻訳は、.Net Linq-to-SqlライブラリまたはEntityフレームワークに依存しています。

その機能を持つ他のツールも知りません。単純な場合は作成できますが、より複雑なシナリオでは、一部のSQL構成要素に一致するLINQ式がないため不可能です。

5
Anders Abel