我有以下查询,有时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完全取消,异常消失
答案 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();
}
如果您正在执行复杂查询(例如,如果订单不为空,显示所有订单项的总和)并遍历大量对象,则此优势更加便宜。