2014-10-01 52 views
7

我在MMM dd,YYYY格式來顯示日期。如何將DateTime轉換爲Linq查詢中的字符串?

var performancereviews = from pr in db.PerformanceReviews 
             .Include(a => a.ReviewedByEmployee) 
           select new PerformanceReviewsDTO 
           { 
            ReviewDate=pr.ReviewDate.ToString("MMM dd,yyyy"), 
            EmployeeName=pr.ReviewedByEmployee.Name, 
            JobTitle=pr.ReviewedByEmployee.JobTitle, 
            ReviewerComments=pr.CommentsByReviewer, 
            EmployeeComments=pr.CommentsByEmployee 
           }; 

這裏是我得到

ExceptionMessage錯誤消息:LINQ到實體無法識別方法「System.String的ToString(System.String)」的方法,而且這種方法不能被翻譯進入商店表達。 ExceptionType: System.NotSupportedException

,當我在pr.ReviewDate申請ToString我得到的錯誤。

請指引我正確的解決辦法,我怎麼能做到這一點。我知道在正常的C#編碼中有幾種可用的選項,但在Linq中,我們該如何做到。

+0

一般顯示格式將在*顯示*邏輯來執行,而不是查詢數據時。什麼是「PerformanceReviewsDTO.ReviewDate」的類型?這段代碼給你什麼錯誤? – David 2014-10-01 17:04:09

+0

@大衛我知道類型的,如果我存儲字符串類型值,那麼definitly它應該是字符串,它是這裏的字符串是錯誤ExceptionMessage: LINQ到實體無法識別方法「System.String的ToString(System.String)」的方法,並且此方法不能轉換爲商店表達式。 例外類型: 系統。NotSupportedException – ProgrammingNinja 2014-10-01 17:06:28

+0

爲什麼有人低估,請不要忘記在downvoting時給予評論。 – ProgrammingNinja 2014-10-01 17:17:49

回答

13

這是發生,因爲LINQ到實體試圖表達式樹轉換成SQL查詢,而.ToString()可以轉換成SQL,.ToString(string)不能。 (SQL沒有字符串格式化相同的概念。)

要解決這個問題,不要在查詢執行格式化,在顯示邏輯執行它。請查詢儘可能簡單:

select new PerformanceReviewsDTO 
{ 
    ReviewDate=pr.ReviewDate, 
    EmployeeName=pr.ReviewedByEmployee.Name, 
    JobTitle=pr.ReviewedByEmployee.JobTitle, 
    ReviewerComments=pr.CommentsByReviewer, 
    EmployeeComments=pr.CommentsByEmployee 
} 

在這種情況下PerformanceReviewsDTO.ReviewDate仍然是一個DateTime值。它沒有格式化數據,只是攜帶它。 (如DTO應該。)

然後當你顯示的值時,執行格式化。例如,在這個被在MVC視圖?:使用

@Model.ReviewDate.ToString("MMM dd,yyyy") 

你甚至可能只需添加一個簡單的屬性來PerformanceReviewsDTO的格式顯示:

public string FormattedReviewDate 
{ 
    get { return ReviewDate.ToString("MMM dd,yyyy"); } 
} 

那麼無論是結合性能上DTO可以與之綁定(假設在這種情況下它是單向綁定)。

+0

謝謝大衛回答我已經從Web Api和Web Api中返回數據我只有這個地方將它轉換爲適合我的視圖中移動應用程序所需的格式。您可以看到我正在使用DTO(數據傳輸對象)我已經在尋找Haedrian解決方案瞭解如何去做。 – ProgrammingNinja 2014-10-01 17:15:58

+0

@ProgrammingNinja:我最後一次向DTO添加屬性的建議應該滿足這個要求。當WebAPI序列化發生時,它應該序列化'FormattedReviewDate'屬性以及'ReviewDate'屬性。 (如果命名很重要,可以分別將它們更改爲'ReviewDate'和'PersistedReviewDate',因此消費代碼不必更改。)至於其他發佈的答案,請注意評論。它可以「工作」,但也可能有嚴重的副作用。 – David 2014-10-01 17:18:26

+0

非常感謝您花時間解決我的問題。 – ProgrammingNinja 2014-10-01 17:25:11

1

我通常解決這個問題的方法是先剛開的數據,然後在內存中選擇它。

var performancereviews = from pr in db.PerformanceReviews 
             .Include(a => a.ReviewedByEmployee) 
             .ToArray() 
             .Select(....); 

通過將ToArray(或列表或其他),它會完成SQL查詢部分,然後從內存中的集合休息 - 這應該是罰款。

+6

請記住,如果系統目前沒有實現整個事物(我們無法從發佈的代碼中看出),那麼將整個集合實現到內存中可能會對性能產生負面影響。 – David 2014-10-01 17:12:56

+2

這導致在數據庫上執行'選擇'時沒有其他工作,特別是返回哪些列的限制。 – Servy 2014-10-01 17:15:46

+0

有投票權,因爲有時候這是一個敏感的方法,只是因爲你可能沒有控制顯示邏輯,或者你的規格可能迫使你這樣做(正如我剛纔所做的那樣)。我不喜歡這樣做,但我在這件事上沒有多少選擇。 – shawty 2017-07-18 19:07:08