2013-10-07 43 views
0

我想在Linq中創建一個查詢到實體。我希望它返回包含從我查詢的表中的字符串派生的DateTime屬性的對象。數據(在SQL Server中)有一個字符串日期字段(在數據庫中顯示爲VARCHAR(8)),稱爲date_occurred。它有一個名爲time_occurred的字符串時間字段(varchar(6))。如何在Linq查詢中創建日期時間值?

date_occurred的內容示例是2013年10月7日的「20131007」。time_occurred的內容示例是「145710」,表示14:57之後10秒。

我已經嘗試了兩種方法不起作用:

Dim ATQuery = From e In EntityContext.vwSecAppAuditToday 
    Order By e.date_occurred, e.time_occurred 
    Select New AuditEntry With { 
     .EventTime = DateTime.ParseExact(Trim(e.date_occurred) & Trim(e.time_occurred), "yyyyMMddHHmmss", CultureInfo.InvariantCulture), 
     .ServerName = e.server_name 
} 

這將引發包含一條消息,指出一個NotSupportedException:「LINQ到實體無法識別方法「的System.DateTime ParseExact(System.String, System.String,System.IFormatProvider)'方法,並且此方法不能轉換爲存儲表達式。「

在這之前,我想:

Dim ATQuery = From e In EntityContext.vwSecAppAuditToday 
    Order By e.date_occurred, e.time_occurred 
    Select New AuditEntry With { 
     .EventTime = New DateTime(Integer.Parse(e.date_occurred.Substring(0, 4)), 
     Integer.Parse(e.date_occurred.Substring(4, 2)), 
     Integer.Parse(e.date_occurred.Substring(6, 2)), 
     Integer.Parse(e.time_occurred.Substring(0, 2)), 
     Integer.Parse(e.time_occurred.Substring(2, 2)), 
     Integer.Parse(e.time_occurred.Substring(4, 2))), 
     .ServerName = e.server_name 
} 

這也將引發NotSupportedException。在這種情況下,消息指出:「只有無參數的構造函數和初始化器在LINQ to Entities中受支持。」

正在嘗試使用Linq來實體嗎?

編輯:評論警報

對於那些誰看到這篇文章後,莫霍面和馬特·約翰遜取得了非常有用的意見。我用+1標記了這些。

+0

你能向我們展示conten 「e.date_occured」和「e.time_occured」? – AlexB

+0

優秀的建議。我將編輯帖子。謝謝! – Tim

+0

您正在使用哪個數據庫,以及您正在使用哪些數據庫類型? –

回答

2

選擇包含感興趣的領域的一個匿名類(稱爲投影),然後創建每個項目的DateTime結構中的IQueryable已經被枚舉後:

Dim ATQuery = From e In EntityContext.vwSecAppAuditToday 
    Order By e.date_occurred, e.time_occurred 
    Select New With { 
     .DateOccurred = e.date_occurred, 
     .TimeOccurred = e.time_occurred, 
     .ServerName = e.server_name 
} 

Dim q2 = From e In ATQuery.ToArray() 
     Select New AuditEntry With { 
      .EventTime = DateTime.ParseExact(Trim(e.DateOccurred) & Trim(e.TimeOccurred), "yyyyMMddHHmmss", CultureInfo.InvariantCulture), 
      .ServerName = e.ServerName 
} 
+0

它的工作原理,我很高興 - 謝謝!但爲什麼?是因爲ParseExact調用現在在查詢數組數據而不是實體框架? – Tim

+1

是的 - 你必須記住當使用EF DbContext時,你的IQueryable表達式將被翻譯成一條SQL語句,你遇到的錯誤是由於EF Linq to Entities查詢提供者不知道如何翻譯你的'int.Parse'和'DateTime通過調用'.ToArray()'來枚舉原始數據庫查詢,您可以查詢數據庫並在本地(在內存中)獲取結果,然後您可以使用全部.N.ParseExact調用SQL,因爲這些是.NET構造。 ET語言工具,你認爲合適 – Moho

0

你新的datetime只包含整數,所以它看起來像20131008011300(爲2013年10月8日1時13分00秒)

/日期間,時間之間:和日期和時間之間的space錯過

+0

謝謝,但我仍然有點困惑:我認爲我提供給ParseExact方法的格式字符串佔據了它解析的簡單字符串數字格式。此外,該例外消息指出Linq「不承認該方法。「ParseExact不適用於不包含斜槓,冒號和空格的格式字符串嗎? – Tim

+0

根據異常消息,Linq在可出現在Linq查詢中的代碼中顯得非常具有選擇性 – Tim

+0

這不是一個linq查詢,這是一個LINQ實體查詢 – Moho