18

我最近购买了 LINQPad,希望它能让我将 SQL 语句转换为 LINQ 语句。

使用 LINQPad,我可以附加一个数据库并运行返回我需要的结果的 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 回答