2016-03-07 77 views
0

我有一个SQL查询是如下:任何人都可以将此SQL查询转换为C#Linq语句吗?

SELECT [ClientId] 
    ,[LastDelivery] 
    ,[LastRequisitionDate] 
    ,Datediff (day, LastRequisitionDate, LastDelivery) as DiffDate 
    FROM [dbo].[App_Client] 
    where (LastDelivery != '1900-01-01 00:00:00' 
    and LastRequisitionDate != '1900-01-01 00:00:00') 
    and Inactive = 0 
    and (Datediff (day, LastRequisitionDate, LastDelivery) < 9) 
    and (Datediff (day, LastRequisitionDate, LastDelivery) >= 0) 

我有客户名单,我想谁内的征地8天收到他们送的所有客户端。究其原因,

LastDelivery != '1900-01-01 00:00:00' 
and LastRequisitionDate != '1900-01-01 00:00:00' 

是因为我有我的C#查询方式需要有任何的日期字段(这些字段是在数据库为空的,但他们确实不应该)没有空场。我有一个包含11838个客户端的数据库,并且此查询返回10404.我的问题是我一直无法使用C#linq复制此查询。

我的C#查询如下:

var clients = _clientService.GetAllClients().Where(x => 
(x.LastDelivery != Convert.ToDateTime("01/01/1900") 
&& x.LastRequisitionDate != Convert.ToDateTime("01/01/1900")) 
&& x.Inactive == 0 
&& (((DateTime)x.LastDelivery - (DateTime)x.LastRequisitionDate).Days < 9) 
&& (((DateTime)x.LastDelivery - (DateTime)x.LastRequisitionDate).Days >= 0)).ToList(); 

该查询返回结果10563,159的差别,我想不出在所有我要去哪里错了。对我来说,C#查询看起来与SQL相同,但在某处存在差异。我一整天都在编写代码,所以也许我已经被烧毁了,解决办法很明显,但我看不到它。任何人都可以帮助,或者提出我可能做错了什么或忽略了什么?

回答

由于正确地由马特·史密斯低于指出,事实证明,这两个查询是正确的 - 这种差异在SQL DateDiff函数,该措施1.天情人节过后的午夜,这意味着在比较01为打好/ 01/2016 23:59:59和01/02/2016 00:00:01给出了一天的差异,而在我的C#查询中,它将几天中的实际差异作为时间跨度(24小时)进行比较。感谢马特史密斯,我们有很好的发现和重要的区别。

+0

一个可以简单地将SQL查询转换为LINQ! – dotctor

+2

好吧,将生成的SQL与原始SQL进行比较。 – TomTom

+1

我不知道该怎么做...... – necrofish666

回答

2

你有你的日期值中的时间组件?如果是这样,DateDiff在SQL中的工作方式与DateDiff(日期'03/06/2016 23:59:59','03/07/2016 00:00:01')= 1之间存在重要区别, .NET在哪里('03/07/2016 23:00:00' - '03/06/2016 23:59:00')。Days = 0。DateDiff(day,x,y)度量跨越日期边界的数量。在.NET中,DateTimes的减法返回Time,天,小时,分,秒,毫秒,TimeSpan.Days返回TimeSpan中的天数。

2

由于我没有你的数据,我不能确定这是否有效,但请放手。它至少应该给你的东西去与

var clients = (from client in _clientService.GetAllClients() 
        let minDate = DateTime.MinValue 
        let lastRequisitionDate = (DateTime)client.LastRequisitionDate 
        let lastDeliveryDate = (DateTime)client.LastDeliveryDate 
        let lastDelivery = (DateTime)client.LastDelivery 
        where lastRequisitionDate != minDate && lastDelivery != minDate && client.Inactive != 0 && (lastDelivery - lastRequisitionDate).Days < 9 && (lastDelivery - lastRequisitionDate).Days >= 0 
        select client).ToList(); 

您也有可能使事情对自己更容易通过改变你Client实体,允许为空的日期:

public class Client 
{ 
    public DateTime? LastRequisitionDate {get; set;} 
} 
+0

感谢您的回应,但尝试过,但它没有工作:( – necrofish666

+0

因为在抛出一个异常没有工作,或“工作”,但仍然返回不正确的客户数? – Jedediah

+0

对不起 - 它的工作,但仍然返回不正确的金额 – necrofish666

1
var clients = (from a in _clientService.GetAllClients().ToList() 
       where 
       (a.LastDelivery != DateTime.Parse("1900-01-01 00:00:00") 
       && 
       a.LastRequisitionDate != DateTime.Parse("1900-01-01 00:00:00")) 
       && ((a.LastRequisitionDate - a.LastDelivery).Days < 9) 
       && ((a.LastRequisitionDate - a.LastDelivery).Days >= 0) 
       && a.Inactive == 0 
       select a).ToList(); 
相关问题