将字符串设置为“”在LINQ查询中为NULL

时间:2011-04-20 15:06:10

标签: c# .net linq

我有以下查询,有时ExpirationDate为null会导致查询崩溃,应用程序崩溃。如果ExpirationDate为空,我想为""返回ExpirationDate。如何在LINQ中添加if条件?

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();

更新:

添加代码Jon建议我得到以下异常

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

(press.PressID.ToString()=   调用(值(System.Func`1 [System.String]))))。选择(按下   =&GT; new PData(){Heading = press.Heading,Description =   press.MetaDescription,DatePublished =   press.PublishDate.ToShortDateString()   ExpirationDate =   IIF((press.ExpirationDate = null),“”,   press.ExpirationDate.Value.ToShortDateString()),   Body = press.BodyContent,ID =   press.PressID,CreatedBy =   press.CreatedBy})'进入SQL并且可以   不要把它当作本地表达。

将ExpirationDate完全取消,异常消失

3 个答案:

答案 0 :(得分:4)

我会用:

ExpirationDate = press.ExpirationDate == null ? "":
                        press.ExpirationDate.Value.ToShortDateString()
编辑:话虽如此,它只能解决眼前的问题。我同意Nelson将其保持为DateTime?并在展示时执行转换的方法。除此之外,这意味着您可以在此时为用户应用适当的文化信息等。

答案 1 :(得分:3)

我知道它没有直接回答你的问题,但是......

如果可能,我会将日期保持为DateTime?。通常,您希望在显示时(而不是之前)格式化它(ToShortDateString()等)。

修改:同样在where press.ID.ToString() == this.PressID中:this.PressID理想情况下会匹配press.ID的类型。实际上,语言是强类型的。如果你把所有的变量都变成了字符串,它就会破坏整个目的。

当然有一些不寻常的情况,你可能必须这样做而你的可能就是其中之一,但我认为没有迹象表明是这种情况。

答案 2 :(得分:0)

就个人而言,我会选择@Jon Skeet建议的选项,但如果你不喜欢这种语法,那么另一种方法是编写扩展方法并调用

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

如果您正在执行复杂查询(例如,如果订单不为空,显示所有订单项的总和)并遍历大量对象,则此优势更加便宜。