LinqPad - 将SQL转换为Linq命令

Rav*_*Ram 14 linqpad linqer

我最近购买了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)

更多信息在这里.

  • 是的,嗯,对您来说很容易,乔!:) (2认同)

Aki*_*kim 8

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

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

  1. 通过配置产生的LINQ到转储SQL语句的日志记录stdout使用
  2. 手动重写Linq语句,直到你得到你需要的

  • Linqpad 确实有一个非常好的将 Linq 查询转换为 SQL 的功能(尽管它使用 .Net Linq-to-SQL 库来实现这一点,所以您的情况可能会有所不同)。我发现它在教育那些刚刚开始使用 Linq 但熟悉 SQL 以及验证我在 Linq 中编写的内容是否生成类似于 SQL 查询的结果方面做得很好。 (2认同)

And*_*bel 6

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

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