2015-02-10 76 views
0

在第三方數據庫中,日期以YYYYMMDD格式存儲爲字符串。將linq內的日期轉換操作轉換爲實體

在SQL我可以使用下面的語句:

WHERE convert(datetime,convert(varchar(8),a.appt_date,112)) = convert(datetime,convert(varchar(8), dateadd(dd,+1,getdate()), 112)) 

是否有類似的東西,我可以在LINQ做EF?或者是我記憶中做它唯一的選擇,例如:

dim data = (from item in entities.itemsSet).ToList() 
dim filtered = from item in data 
     where Convert.ToDateTime(shift.starttime) >= startDate 
      && Convert.ToDateTime(shift.endtime) < endDate 
     select item 
+0

你有沒有嘗試你的第二個例子'ToList()'?它應該只是工作([鏈接](http://stackoverflow.com/q/992189/335858))。 – dasblinkenlight 2015-02-10 14:39:17

+0

首先,這是*不*您如何比較SQL中的日期。您應該將字段從'datetime'轉換爲'date',並將其與日期參數進行比較。 SQL Server足夠聰明,可將其轉換爲範圍查詢。其次,爲什麼'Convert.ToDateTime'如果底層字段已經是日期?如果不是,它使用了錯誤的類型,應該先修復 – 2015-02-10 14:39:54

+0

只要注意到你*將日期存儲爲字符串。你需要先解決這個問題。 SQL Server確實有'日期'類型。沒有理由爲此使用字符串,以及許多原因,您不應該這樣做。 – 2015-02-10 14:57:44

回答

1

,你應該這樣做:

dim d = SomeDate 
dim d0 = d.Date().ToString("yyyyMMdd") 
dim d1 = d.AddAys(1).ToString("yyyyMMdd") 
dim filtered = from item in data 
    where d0 >= startDate 
     && d1 < endDate 
    select item 

那就是建立自己的字符串中的代碼,並把它作爲參數您查詢。您將爲同樣的結果節省大量的轉換時間。

+0

實際上,您*因此導致*轉換,因爲您強制SQL Server將字符串轉換爲不需要的日期。 EF使用參數化查詢,因此日期始終以日期形式傳輸。如果底層文件不是日期 - 那麼就有一個必須修復的錯誤 – 2015-02-10 14:54:36

+0

@PanagiotisKanavos文章的第一行:在我的數據庫日期裏面存儲爲格式爲YYYYMMDD的字符串。 – tschmit007 2015-02-10 14:55:38

+0

這是一個bug然後 – 2015-02-10 14:56:20