18

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

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

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

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

4

3 に答える 3

50

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に音訳することです。正しい方法は、元のクエリ (英語) を直接 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

詳細はこちら

于 2012-09-03T00:41:00.687 に答える
10

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

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

  1. Linq によって生成されたダンプ SQL ステートメントのログを使用するように構成stdoutする
  2. 必要なものが得られるまで、Linqステートメントを手動で書き直します
于 2012-09-02T18:24:51.783 に答える
8

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

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

于 2012-09-02T18:05:15.190 に答える