如何将SQL查询转换为Linq?

3

我将尝试将一个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中没有合适的等效物。


4
这是很多工作量,你至少应该在尝试之前查看示例 - 可在此处查看 http://msdn.microsoft.com/zh-cn/vcsharp/aa336746 - Marc
1
你尝试过使用 LinqPad 吗?它可以帮助你创建 SQL 和 Linq 查询。 - Prasanth
你在哪个部分遇到了问题?请展示你自己编写的代码(提示:从 var result = from b in db.Buyer 开始),告诉我们你所困惑的地方,以及你尝试过但没有成功的方法。 - Merlyn Morgan-Graham
如果你感到困难,可以使用 http://www.sqltolinq.com/ 这样的工具。然而,花时间解决问题并学习其中的知识一定是值得的。 - christofr
@christofr:我认为SQLTOLINQ不会正确地转换DATEDIFF。 - Marshal
2个回答

1

我发现你编写的代码存在几个问题。

  • LinqToSql 不支持 DateTime.Subtract,对于这种操作,你需要使用 SqlMethods.DateDiffDay docs
  • 字符串 "false" 无法转换为布尔值,你需要使用 bool.Parse 或者和你原来一样,直接比较字符串 "false"。
  • 你原来的代码获取了一个不同的发票 ID 列表,但是在你的 LINQ 尝试中完全缺失。将 .Select(t => t.InvoiceID).Distinct() 添加到你的 LINQ 中。

0
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();

1
LinqToSql不支持在日期时间上使用任何Add/Subtract方法。这就是SqlMethods的作用。 - Jamiec
1
我可以毫无问题地在基于 SQL 的日期时间字段上添加天数... 我是错过了什么吗? - Alex
1
我的错,是所有的日期差方法都不起作用(因此才有了我在回答中提供链接的SqlMethods)。 - Jamiec

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接