【问题标题】:how sql query convert in Linq [closed]sql查询如何在Linq中转换[关闭]
【发布时间】:2011-10-18 08:43:26
【问题描述】:

我正在尝试将 SQL 查询转换为 Linq

查询是:

 SELECT Distinct(InvoiceID)
 FROM Invoices
 WHERE ((DATEDIFF(day, InvoiceDate, GETDATE()) > PaymentDays)  AND
 status= 'false') 

我写了以下代码,但没有得到正确的结果......

var outstanding = db.Invoices.Where(t =>
     (t.InvoiceDate.Value.Subtract(DateTime.Today)).Days > t.PaymentDays.Value 
    && !(bool)t.Status)

在我看来,DATEDIFF 在 LINQ to SQL 中没有适当的等效项

【问题讨论】:

  • 工作量很大,您至少应该先尝试一下 - 在这里查看示例msdn.microsoft.com/en-us/vcsharp/aa336746
  • 您是否尝试过有助于创建 SQL 和 Linq 查询的 LinqPad?
  • 您对哪个部分特别有问题?向我们展示代码,描述您自己可以走多远(提示:以var result = from b in db.Buyer 开头),并告诉我们您在哪里感到困惑,以及您尝试过哪些没有奏效的方法。
  • 如果您遇到困难,可以使用sqltolinq.com 等工具。但是,花时间解决您的问题并一路学习是非常值得的。
  • @christofr:我认为 SQLTOLINQ 不能正确翻译 DATEDIFF

标签: c# .net sql-server linq-to-sql


【解决方案1】:

我发现您编写的代码存在一些问题。

  • LinqToSql 不支持DateTime.Subtract,这种操作需要SqlMethods.DateDiffDay docs
  • 字符串“false”不能转换为布尔值,您需要使用bool.Parse 或仅与原始字符串“false”进行比较。
  • 您的原件会获得一份不同的发票 ID 列表。您的 LINQ 尝试完全缺少这一点。将 .Select(t => t.InvoiceID).Distinct() 附加到您的 LINQ。

【讨论】:

    【解决方案2】:
    DATEDIFF(day, InvoiceDate, GETDATE()) > PaymentDays
    

    应该翻译成

    DateTime.Today.AddDays(-1*PaymentDays) > InvoiceDate
    

    更新

    这应该会获取你需要的东西

    var outstanding = db.Invoices.Where(t => t.InvoiceDate.Value.AddDays(t.PaymentDays.Value) > DateTime.Today).Where(u => u.Status.Equals("false")).Select(v => v.InvoiceID).Distinct();
    

    【讨论】:

    • LinqToSql 不支持日期时间的任何 Add/Subtract 方法。这就是SqlMethods 所修复的。
    • 我可以在我的基于 sql 的日期时间字段中添加Days 没有问题...我错过了什么吗?
    • 我的错,它所有的 datediff 方法都不起作用(因此我在答案中链接了SqlMethods)。
    猜你喜欢
    • 2021-01-28
    • 2018-07-31
    • 1970-01-01
    • 2021-01-19
    • 1970-01-01
    • 2021-10-13
    • 2020-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多