0

我有一个 Linq 查询,它由我从数据库中提取的这个日期时间字段组成

           TerminationDate = base.ConvertFromUtcToCentral(r.TerminationDate.ToString())

使用的功能是这样设计的

           public DateTime ConvertFromUtcToCentral(string UtcTime)
    {

        if (UtcTime != "")
        {
            DateTime?  retValue = TimeZoneInfo.ConvertTimeFromUtc(Convert.ToDateTime
                                                       (UtcTime), USTimeZones.Central);

            return Convert.ToDateTime(retValue);
        }
        else
            return Convert.ToDateTime(null);

    }

但是,每当我返回 null 时,它都会在网格中显示我将此查询分配给的最小日期。但是,当它为 null 时,它应该只显示 null 而不是 min date。你能告诉我如何处理这个问题吗?如果使用三元运算符是一个更好的主意,请告诉我。

限制:无法更改函数重运行类型,因为它在多个地方使用

4

5 回答 5

3

由于您要返回值类型 DateTime,因此不能返回 null。您可以更改函数以返回可为空的 DateTime (DateTime?)、引发异常或返回 DateTime 的默认值 default(DateTime)。恕我直言,我会抛出 System.ArgumentException,因为要转换的空字符串显然不会产生输出。

于 2012-06-05T19:06:54.280 回答
2

也许你可以尝试返回null。让你的函数返回DateTime?,所以return Convert.ToDateTime(null);你可以做return null

对不起英语不好!

于 2012-06-05T19:07:39.790 回答
1

由于您不能更改函数的限制,那么您可以在以下位置抛出一个 terinery 运算符:

TerminationDate = ( base.ConvertFromUtcToCentral(r.TerminationDate.ToString()) == default(DateTime) ? (DateTime?) null : (DateTime ?) base.ConvertFromUtcToCentral(r.TerminationDate.ToString()) );

我不喜欢这样,因为它两次调用该函数。我可能会写一个包装器方法来做这样的事情

public static DateTime? WrapperConvertFromUtcToCentral(string UtcTime)
{
    DateTime value = ConvertFromUtcToCentral(string UtcTime);

    if (value == default(DateTime))
         return (DateTime?)null;
    else
         return (DateTime?)value;
}

TerminationDate = WrapperConvertFromUtcToCentral(r.TerminationDate.ToString())        

这样,您只调用一次原始函数。

于 2012-06-05T19:38:12.823 回答
1

最近的编辑和评论表明TerminationDate可能是DateTime?. 也许添加一个新的重载来显式处理DateTimeDateTime值并正确返回DateTimeDateTime?代替?我看到您无法轻松更改此方法的返回类型,因此添加这些新的重载并在您的应用程序中逐渐使用它们可能是使用更好的数据类型的好方法。

public DateTime ConvertFromUtcToCentral(string UtcTime)
{
    return !string.IsNullOrEmpty(UtcTime)
        ? this.ConvertFromUtcToCentral(Convert.ToDateTime(UtcTime))
        : default(DateTime);
}

public DateTime? ConvertFromUtcToCentral(DateTime? UtcTime)
{
    return UtcTime.HasValue
        ? this.ConvertFromUtcToCentral(UtcTime.Value)
        : (DateTime?)null;
}

public DateTime ConvertFromUtcToCentral(DateTime UtcTime)
{
    return TimeZoneInfo.ConvertTimeFromUtc(UtcTime, USTimeZones.Central);
}

如果您不更改返回类型,您将始终需要DateTime从方法中获取非空值,除非 - 正如 user957902 建议的那样 - 您开始抛出Exceptions。:) 如果您不能使用它,您也可以修改消费应用程序以处理DateTime.MinValue类似null并且不显示任何内容。

是否使用三元运算符可能是个人喜好问题——在像这样的简单情况下,我确实喜欢使用它(我的示例中的换行符纯粹是为了在 SO 上更容易阅读),因为它很容易阅读并且只有两条路径可以走峡谷路。

于 2012-06-05T20:05:06.700 回答
0

无法为 DateTime 分配空值,因为它不是可空类型尝试分配 DBNull.Value 而不是 null,同时将其发布回数据库

于 2012-11-29T07:23:51.077 回答