2016-03-07 32 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(); 
相關問題