【发布时间】:2012-09-02 18:00:40
【问题描述】:
我最近购买了 LINQPad,希望它可以让我将 SQL 语句转换为 LINQ 语句。
使用 LINQPad,我可以附加一个数据库并运行返回我需要的结果的 SQL 语句。
但我找不到将 SQL 语句转换为 LINQ 的“命令”。
您能否告诉我如何使用 LINQPad 或其他工具将 SQL 转换为 LINQ?
【问题讨论】:
-
有一个工具:见下面我的回答
标签: linqpad
我最近购买了 LINQPad,希望它可以让我将 SQL 语句转换为 LINQ 语句。
使用 LINQPad,我可以附加一个数据库并运行返回我需要的结果的 SQL 语句。
但我找不到将 SQL 语句转换为 LINQ 的“命令”。
您能否告诉我如何使用 LINQPad 或其他工具将 SQL 转换为 LINQ?
【问题讨论】:
标签: linqpad
有一个工具叫Linqer,但要小心:从SQL 音译到LINQ 可以给你worst of both worlds。
例如,假设您希望所有 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
更多信息here。
【讨论】:
一般来说,没有像@andres-abel 之前提到的那样将 SQL 转换为 Linq 的工具,但有时您必须编写完全按照指定 SQL 执行的 Linq(例如,由于性能问题、向后兼容性或其他一些原因)。
在这种情况下我建议你自己做逆向工程:
stdout 使用
【讨论】:
LinqPad 不包含 SQL->LINQ 转换器。 LinqPad 实际上也不包含任何 LINQ->SQL 转换器。它依赖于 .Net Linq-to-Sql 库或实体框架进行翻译。
我也不知道有任何其他工具具有该功能。在简单的情况下可以创建一个,但对于更复杂的情况,这是不可能的,因为没有 LINQ 表达式可以匹配某些 SQL 构造。
【讨论】:
LINQ -> SQL。