LinqPad – 将SQL转换为Linq命令

我最近购买了LinqPad,希望它能让我把一些SQL转换成LINQ语句。

使用LinqPad,我可以附加数据库并运行SQL语句,它返回我需要的结果。

但是我找不到一个“命令”将该SQL语句转换为LINQ。

你可以让我知道如何使用LinqPad将SQL转换为LINQ? 或另一个工具。

一般情况下,没有工具可以将SQL转换为Linq,就像之前提到的@ andres-abel一样,但是有时你必须编写Linq来完全按照指定的SQL执行(例如,由于性能问题,向后兼容性或其他原因)。

在这种情况下, 我会build议你自己做逆向工程

  1. configuration由Linq生成的转储SQL语句的logging到stdout使用
    • ObjectQuery.ToTraceString
    • DbCommand.CommandText
    • 将数据logging到您的数据源
  2. 手动重写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结构。