我最近购买了LinqPad,希望它允许我将一些SQL转换为LINQ语句。
使用LinqPad,我可以附加数据库并运行SQL语句,返回我需要的结果。
但我无法找到将该SQL语句转换为LINQ的'命令'。
请告诉我如何使用LinqPad将SQL转换为LINQ?或其他工具。
答案 0 :(得分:42)
有一个名为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。
答案 1 :(得分:7)
一般来说,没有工具可以将SQL转换为Linq,因为@ andres-abel之前提到过,但有时您必须编写将完全按指定SQL执行的Linq(例如,由于性能问题,向后兼容性或其他一些原因)。
在这种情况下我会建议你自己进行逆向工程:
stdout
答案 2 :(得分:5)
LinqPad不包含SQL-> LINQ转换器。 LinqPad实际上不包含任何LINQ-> SQL转换器。它依赖于.Net Linq-to-Sql库或实体框架进行翻译。
我也不知道具有该功能的任何其他工具。在简单的情况下,可以创建一个,但对于更复杂的场景,因为没有LINQ表达式匹配某些SQL结构,所以不可能。