2011-04-20 53 views
2

我有以下查詢,有時ExpirationDate爲空,這會導致查詢和應用程序崩潰。如果ExpirationDate爲空,我想爲ExpirationDate返回""。如何在LINQ中添加此條件?將字符串設置爲「」在一個LINQ查詢中NULL NULL

List<PData> pressData = 
    (from press in dataContext.CPress 
     where press.ID.ToString() == this.PressID 
     select new PData 
     { 
      Heading = press.Heading, 
      Description = press.MetaDescription, 
      DatePublished = press.PublishDate.ToShortDateString(), 
      ExpirationDate = press.ExpirationDate.Value.ToShortDateString(), 
      Body = press.BodyContent, 

      CreatedBy=press.CreatedBy 
     }).ToList(); 

UPDATE:

添加代碼喬恩建議我得到下面的異常

Could not translate expression 'Table(CPress).Where(press => 

(press.PressID.ToString()= 調用(值(System.Func` 1 [System.String]))))。Select(press => new PData(){Heading = press.Heading,Description = press.MetaDescription,DatePublished = press.PublishDa te.ToShortDateString(), 到期日期= IIF((press.ExpirationDate = NULL) 「」, press.ExpirationDate.Value.ToShortDateString()), 車身= press.BodyContent,ID = press.PressID,CreatedBy = press.CreatedBy})'到SQL,並可能 不把它當作本地表達式。

以到期日期出完全例外消失

回答

3

我知道這不回答你直接的問題,但...

如果可能的話,我會保持日期DateTime?。通常你想要格式化它(ToShortDateString()等),只要你顯示它,而不是之前。

編輯:同樣在where press.ID.ToString() == this.PressIDthis.PressID將理想地匹配press.ID類型。真的,這種語言是強烈類型的原因。如果你讓所有的變量都是字符串,它就會失去整個目的。

當然,也有一些不尋常的情況下,您可能不得不這樣做,你可能是其中之一,但我看不出有任何跡象表明,是這種情況。

+0

我正在使用綁定語法將值綁定到控件。如何在DateTime類型的東西上使用綁定語法? – 2011-04-20 15:33:20

+0

Text ='<%#Eval(「ExpirationDate」)%>' – 2011-04-20 15:35:09

+0

@Nick:您可以指定格式字符串。例如:'<%#Eval(「ExpirationDate」,「{0:MM/dd/yyyy}」)%> – 2011-04-20 15:40:09

4

我會使用:

ExpirationDate = press.ExpirationDate == null ? "": 
         press.ExpirationDate.Value.ToShortDateString() 

編輯:說了這麼多,那就只能解決眼前的問題。我同意尼爾森將其保留爲DateTime?並在顯示時間進行轉換的方法。除此之外,這意味着您可以在此時爲用戶應用適當的文化信息等。

+0

如果使用語法而不是簡寫法,是否合法? – 2011-04-20 15:12:46

+0

@Nick:如果這將被轉換爲表達式樹,則不會。 – 2011-04-20 15:23:46

0

個人而言,我會去爲@喬恩飛碟雙向曾建議的選項,而是一個選擇,如果你不喜歡的語法編寫擴展方法,並調用該

public static string ToShortDateStringOrEmpty(this DateTime? dt) 
{ 
    if (dt == null) 
     return String.Empty; 
    else 
     return dt.ToShortDateString(); 
} 

這樣做的好處如果你正在做一個複雜的查詢(例如,如果訂單不爲空,請顯示所有訂單項的總和)並遍歷大量對象,那麼它們會更整潔。

+1

雖然這不適用於LINQ to SQL等,因爲它不知道它。 – 2011-04-20 15:24:52

+0

的確如此,如果你想這樣做,你必須在前一次返回時擁有一個AsEnumerable,但是你將擁有客戶端而不是服務器上的所有數據。 – 2011-04-20 15:32:59

相關問題