我最近购买了LinqPad,希望它允许我将一些SQL转换为LINQ语句.
使用LinqPad,我能够附加数据库并运行SQL语句,返回我需要的结果.
但我找不到一个'命令'来将该SQL语句转换为LINQ.
你能告诉我如何使用LinqPad将SQL转换为LINQ吗?或其他工具.
Joe*_*ari 47
有一个名为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
)
Run Code Online (Sandbox Code Playgroud)
如何将此转换为LINQ?错误的方法是将查询音译为LINQ,尝试重现外部和内部联接,子查询和组子句.正确的方法是将原始查询(英文)直接映射到LINQ,利用LINQ的线性数据流和关联属性:
我想要所有购买......
from p in db.Purchases
Run Code Online (Sandbox Code Playgroud)
...... 1000美元或更高......
where p.PurchaseItems.Sum (pi => pi.SaleAmount) > 1000
Run Code Online (Sandbox Code Playgroud)
......以现金支付......
where p.Customer == null
Run Code Online (Sandbox Code Playgroud)
......或住在华盛顿的客户
|| p.Customer.Address.State == "WA"
Run Code Online (Sandbox Code Playgroud)
这是最后的查询:
from p in db.Purchases
where p.PurchaseItems.Sum (pi => pi.SaleAmount) > 1000
where p.Customer == null || p.Customer.Address.State == "WA"
select p
Run Code Online (Sandbox Code Playgroud)
更多信息在这里.
一般来说,没有工具可以将SQL转换为Linq,就像之前提到的@ andres-abel一样,但有时您必须编写将完全按指定SQL执行的Linq(例如,由于性能问题,向后兼容性或其他一些原因).
在这种情况下,我建议你自己做逆向工程:
stdout使用
LinqPad不包含SQL-> LINQ转换器.LinqPad实际上不包含任何LINQ-> SQL转换器.它依赖于.Net Linq-to-Sql库或实体框架进行翻译.
我不知道任何其他具有该功能的工具.在简单的情况下,可以创建一个,但对于更复杂的场景,因为没有LINQ表达式匹配某些SQL结构,所以不可能.
| 归档时间: |
|
| 查看次数: |
70029 次 |
| 最近记录: |