2011-05-16 34 views
1

我們有一個遺留數據庫(SQLServer 2008),其中有成千上萬行。每條記錄都有一個日誌日期字段,它是一個日期,但以21/04/2010 16:40:12的格式存儲爲varchar。如何訂購存儲在EF4的Varchar字段中的日期

我們只需要返回未來logdate的行,並按日期排序。我們可以撤回所有行並在服務器上過濾,但這看起來不對,並且不會擴展。

是否有這樣做的過濾和排序在實體框架4

的方式這是我們認爲可能的工作,但它的失敗。

from c in db.changes 
where [DateTime]c.logdate > DateTime.Today() 
orderby [DateTime]c.logdate 
select c; 

任何幫助表示讚賞。

回答

2

您無法使用任何內置的L2E功能將字符串解析爲數據庫服務器上的日期。

您可以:

  1. 映射功能DB自己,
  2. 寫SQL與ObjectContext.ExecuteStoreQuery執行它,或
  3. 修復的元數據。

我會選擇後者,如果是我。

+0

你可以擴大一點。我將如何去修復元數據?數據庫用於外部應用程序,我們只有讀取權限。 – 2011-05-16 22:00:00

+0

如果您無法更改數據庫,則無法修復元數據。這意味着你必須忍受不可索引的查詢。 – 2011-05-17 13:13:25

+0

感謝Craig,我們將研究'ObjectContext.ExecuteStoreQuery'的想法,並看看我們如何繼續。 – 2011-05-17 15:02:51

1

我不確定你可以通過純LINQ來完成,除非你創建自己的LINQ函數。如果您可以執行即席查詢,並有EF4回翻譯成對象,就像你可以在DataContext.Translate LINQ2SQL的方法,你可以將它轉換是這樣的:

CONVERT(datetime, logdate, 103) 

就這樣你的查詢將是:

SELECT 
    * 
FROM 
    changes 
WHERE 
    CONVERT(datetime, logdate, 103) > GETDATE() 
ORDER BY 
    CONVERT(datetime, logdate, 103) 

另外,如果你可以添加到架構(我假設你不能修改VARCHAR列將其存儲爲日期本身),你可以添加一個計算列像這樣:

ALTER TABLE 
    changes 
ADD 
    logdateDatetime AS CONVERT(datetime, logdate, 103) PERSISTED 

然後查詢logdateDatetime列而不是logdate。

+0

這是用於某些外部軟件的遺留數據庫,因此不能以任何方式更改架構。 – 2011-05-16 21:57:41

0

varchar字段中的順序與日期字段中的順序大不相同。修復您的結構以正確存儲日期或添加通過觸發器填充的附加日期字段。可能你在那裏也有糟糕的日期,因爲varchar字段上沒有控制來排除日期。你還需要修正這些日期。

+0

這是一些外部軟件的遺留數據庫,因此以任何方式更改架構都不在考慮範圍之內。 – 2011-05-16 21:58:02

+0

你可以添加一個日期與日期相關的表嗎? – HLGEM 2011-05-17 14:17:33

+0

不允許更改數據庫本身,我們可能可以在本地數據庫上創建一個表並將數據複製到轉換路上的躲閃日期字段。目前我們正在研究Craig提出的ObjectContext.ExecuteStoreQuery。 – 2011-05-17 15:02:06

相關問題