【问题标题】:LinqPad - Convert SQL to Linq commandLinqPad - 将 SQL 转换为 Linq 命令
【发布时间】:2012-09-02 18:00:40
【问题描述】:

我最近购买了 LINQPad,希望它可以让我将 SQL 语句转换为 LINQ 语句。

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

但我找不到将 SQL 语句转换为 LINQ 的“命令”。

您能否告诉我如何使用 LINQPad 或其他工具将 SQL 转换为 LINQ?

【问题讨论】:

标签: linqpad


【解决方案1】:

有一个工具叫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

【讨论】:

【解决方案2】:

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

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

  1. 配置将 Linq 生成的转储 SQL 语句记录到 stdout 使用
  2. 手动重写 Linq 语句,直到你得到你需要的东西

【讨论】:

  • Linqpad 确实可以很好地将 Linq 查询转换为 SQL(尽管它使用 .Net Linq-to-SQL 库来实现,因此您的使用范围可能会有所不同)。我发现它在教育那些刚开始使用 Linq 但熟悉 SQL 的人以及验证我在 Linq 中编写的内容是否产生类似于 SQL 查询的结果方面做得很好。
【解决方案3】:

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

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

【讨论】:

  • 您的意思可能反之亦然。它包含LINQ -> SQL
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-19
  • 1970-01-01
  • 2013-05-19
相关资源
最近更新 更多