【问题标题】:How to convert Lambda Expression into SQL exp?如何将 Lambda 表达式转换为 SQL exp?
【发布时间】:2017-09-19 05:46:30
【问题描述】:

我很难将此表达式转换为 SQL 表达式。我尝试了各种应用程序,但都失败了。我尝试自己转换,但结果不同。

db.Trans_SAPStat.Where(s => s.EmployeeID == EmployeeID && s.PaymentID != PaymentID && !s.Status.Equals("cancelled or", StringComparison.OrdinalIgnoreCase))
                                           .Join(_db.Trans_PaymentDetail,
                                               stat => stat.PaymentID,
                                               paydet => paydet.PaymentID,
                                               (stat, paydet) => new
                                               {
                                                   InvoiceNo = paydet.Remarks,
                                                   paydet.Amount,
                                                   stat.Status,
                                                   paydet.PaymentCode
                                               })
                                           .Where(s => s.PaymentCode.ToLower() == "c")
                                           .GroupBy(g => g.InvoiceNo)
                                           .Select(lg =>
                                                   new
                                                   {
                                                       InvoiceNo = lg.Key,
                                                       TotalAmount = lg.Sum(w => w.Amount)
                                                   }).ToList();

【问题讨论】:

  • 如果您使用的是 LINQPad,您可以单击结果后的 SQL 选项卡以查看 SQL 查询语法。
  • 这就是问题所在。将其复制到 Linqpad 时出现错误
  • 我认为它只接受不接受 lambda 方法作为输入
  • AFAIK 默认 LINQPad 不需要 db 实例,它会自动分配 [table_name] + s 后缀,例如Trans_SAPStats。似乎 LINQPad 接受查询表达式关键字而不是 lambda 关键字。
  • 是的,不幸的是,这是正确的。之后它只是将其转换为 lambda

标签: c# sql lambda linq-to-entities


【解决方案1】:

如果您在工作应用程序中有此代码,请尝试使用 SQL 分析器。另一种选择 - linqpad

【讨论】:

  • 关于Linqpad,不知道怎么做起始码。 "db.[table name] 我得到一个错误
【解决方案2】:

试试这个:

SELECT
  p.Remarks AS InvoiceNo,SUM(p.Amount) AS TotalAmount
FROM Trans_SAPStat AS s
INNER JOIN Trans_PaymentDetail AS p ON s.PaymentID = p.PaymentID
WHERE s.EmployeeID = @EmployeeID 
  AND s.PaymentID <> @PaymentID 
  AND LOWER(s.Status) <> 'cancelled or'
  AND LOWER(s.PaymentCode) = 'c'
GROUP BY p.Remarks

【讨论】:

  • 不,它返回不同的结果
  • @ElbertJohnFelipe - 试试我更新的答案。如果它不起作用,请向我展示这两个表中的一些示例数据。
  • 它返回 4k+ 行。它应该只返回 54 行
  • @ElbertJohnFelipe - 您能否展示两个表中的一些示例数据?顺便说一句,@EmployeeID@PaymentID 是传递给您的查询的参数。
【解决方案3】:

您可以尝试将查询设置为不具体化的变量 (.ToList()),然后只需使用 query.ToString()。这将返回实际的 SQL 查询。

var query = db.Trans_SAPStat.Where(....); // don't call .ToList()
var sqlQuery = query.ToString();
var result = query.ToList(); // materialization

注意:这是实体框架/linq 到实体IQueryable&lt;T&gt; 接口的默认行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-14
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多