2011-04-20 50 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

相关问题