LinqPad - 将SQL转换为Linq命令

时间:2012-09-02 18:00:40

标签: linqpad

我最近购买了LinqPad,希望它允许我将一些SQL转换为LINQ语句。

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

但我无法找到将该SQL语句转换为LINQ的'命令'。

请告诉我如何使用LinqPad将SQL转换为LINQ?或其他工具。

3 个答案:

答案 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(例如,由于性能问题,向后兼容性或其他一些原因)。

在这种情况下我会建议你自己进行逆向工程

  1. 将Linq生成的转储SQL语句的日志记录配置为stdout
  2. 手动重写Linq语句,直到您得到所需内容

答案 2 :(得分:5)

LinqPad不包含SQL-> LINQ转换器。 LinqPad实际上不包含任何LINQ-> SQL转换器。它依赖于.Net Linq-to-Sql库或实体框架进行翻译。

我也不知道具有该功能的任何其他工具。在简单的情况下,可以创建一个,但对于更复杂的场景,因为没有LINQ表达式匹配某些SQL结构,所以不可能。