如何在Linq中转换sql查询

本文关键字:转换 sql 查询 Linq | 更新日期: 2023-09-27 18:11:46

我正在尝试将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中没有合适的等同SQL

如何在Linq中转换sql查询

我发现你写的代码有几个问题。

  • LinqToSql不支持DateTime.Subtract,对于这种操作,你需要SqlMethods.DateDiffDay docs
  • 字符串"false"不能转换为布尔值,您需要使用bool.Parse或只是与字符串"false"进行比较,就像您在原始中所做的那样。
  • 您的原件获得发票id的不同列表。这在你的LINQ尝试中是完全缺失的。在LINQ中添加.Select(t => t.InvoiceID).Distinct()
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();