【问题标题】:Set String To "" In A LINQ Query Where NULL在 NULL 的 LINQ 查询中将字符串设置为“”
【发布时间】:2011-04-20 23:37:48
【问题描述】:

我有以下查询,有时ExpirationDate 为空,这会破坏查询并且应用程序崩溃。如果ExpirationDate 为空,我想为ExpirationDate 返回""。如何将这个 if 条件放入 LINQ?

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() = Invoke(value(System.Func`1[System.String])))).Select(按下 => 新 PData() {标题 = press.Heading,描述 = press.MetaDescription, DatePublished = press.PublishDate.ToShortDateString(), 到期日 = IIF((press.ExpirationDate = null), "", press.ExpirationDate.Value.ToShortDateString()), Body = press.BodyContent, ID = press.PressID, CreatedBy = press.CreatedBy})' 进入 SQL 并可以 不要将其视为本地表达式。

完全去掉 ExpirationDate 异常就消失了

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    我会使用:

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

    编辑:话虽如此,它只会解决眼前的问题。我同意 Nelson 将其保留为 DateTime? 并在显示时执行转换的方法。除此之外,这意味着您可以在那时为用户应用适当的文化信息等。

    【讨论】:

    • 使用 if then 语法代替简写是否合法?
    • @Nick:如果这将被转换为表达式树,则不会。
    【解决方案2】:

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

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

    编辑: 类似地在where press.ID.ToString() == this.PressID 中:this.PressID 将理想地匹配press.ID 的类型。确实,该语言是强类型的,这是有原因的。如果你把所有的变量都变成字符串,它就违背了整个目的。

    当然,在某些不寻常的情况下您可能必须这样做,而您的情况可能就是其中之一,但我没有看到任何迹象。

    【讨论】:

    • 我正在使用绑定语法将值绑定到控件。如何对 DateTime 类型的内容使用绑定语法?
    • Text=' '
    • @Nick:您可以指定格式字符串。例如:&lt;%# Eval("ExpirationDate", "{0:MM/dd/yyyy}") %&gt;
    • @Nick:以下是不同的格式选项:msdn.microsoft.com/en-us/library/26etazsy.aspx 在左侧菜单中,您可以深入了解标准和自定义 DateTime 选项。
    【解决方案3】:

    我个人会选择@Jon Skeet 建议的选项,但如果您不喜欢该语法,另一种选择是编写一个扩展方法并调用它

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

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

    【讨论】:

    • 但这不适用于 LINQ to SQL 等,因为它不会知道。
    • 是的,如果你想这样做,你必须在上一次返回时有一个 AsEnumerable,但是你会在客户端而不是服务器上拥有所有数据。
    猜你喜欢
    • 2011-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 2013-12-28
    • 1970-01-01
    • 2017-10-08
    相关资源
    最近更新 更多