LinqPad – 将SQL转换为Linq命令
我最近购买了LinqPad,希望它能让我把一些SQL转换成LINQ语句。
使用LinqPad,我可以附加数据库并运行SQL语句,它返回我需要的结果。
但是我找不到一个“命令”将该SQL语句转换为LINQ。
你可以让我知道如何使用LinqPad将SQL转换为LINQ? 或另一个工具。
一般情况下,没有工具可以将SQL转换为Linq,就像之前提到的@ andres-abel一样,但是有时你必须编写Linq来完全按照指定的SQL执行(例如,由于性能问题,向后兼容性或其他原因)。
在这种情况下, 我会build议你自己做逆向工程 :
- configuration由Linq生成的转储SQL语句的logging到
stdout
使用-
ObjectQuery.ToTraceString
, -
DbCommand.CommandText
, - 将数据logging到您的数据源
-
- 手动重写Linq语句直到你得到你所需要的
有一个名叫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的线性数据和关联属性stream:
我想要所有购买…
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
更多信息在这里 。
LinqPad不包含SQL-> LINQ翻译器。 LinqPad实际上不包含任何LINQ-> SQL转换器。 它依靠.Net Linq-to-Sql库或Entity框架进行翻译。
我不知道有这种能力的任何其他工具。 在简单的情况下,可以创build一个,但是对于更复杂的场景,这是不可能的,因为没有LINQexpression式匹配某些SQL结构。