在Linq结果中检查DateTime中的Null的语法

时间:2017-03-23 02:29:39

标签: c# linq datetime datatable

我有一个带有两个日期时间字段的强类型数据表。该表填充了SQL Server的数据。 SQL Server中的日期时间字段允许空值。在对DB的ADO调用中,我能够捕获空值。

但是现在我正在对数据表进行Linq调用,我找不到一种语法,可以让我在datetime字段中捕获null。

var results = (from r in dsReleases.dtReleases
    where r.ReleaseNumber == Convert.ToInt32(theRelease)
    select r
).FirstOrDefault();

GetTheDeliveryData(results.Delivery.ToString());

lbReleaseNumber.Text = results.ReleaseNumber.ToString();
lbStartDate.Text = results.StartDate.ToShortDateString();
lbEndDate.Text = results.EndDate.ToShortDateString();
lbQuantity.Text = results.ReleaseQuantity.ToString();
lbStatus.Text = results.Status;

错误在于将开始日期和结束日期写入标签字段。有关如何测试该datetime字段为null的任何建议吗?

我试过了;

lbStartDate.Text = results.StartDate == null ? "": results.StartDate.ToShortDateString();

并收到错误

  

表dtReleases中的“StartDate”列是DBNull。

所以我试过了;

lbStartDate.Text = results.StartDate ==  DBNull.Value ? "": results.StartDate.ToShortDateString();

但是这不会编译,它会给出错误

  

运算符'=='不能应用于'System.DateTime'和'System.DBNull'类型的操作数。

此语法编译,但在运行时崩溃;

lbStartDate.Text = DBNull.Value.Equals(results.StartDate) ? "": results.StartDate.ToShortDateString();  

它让我回到了这个错误,

  

表'dtReleases'中'StartDate'列的值是DBNull。

3 个答案:

答案 0 :(得分:1)

对象中的StartDate属性需要是DateTime?Nullable<DateTime>类型。如:

public DateTime? StartDate { get; set; }

答案 1 :(得分:0)

该消息告诉您解决方案:

  

所以我尝试了这个; lbStartDate.Text = results.StartDate == DBNull.Value? &#34;&#34 ;: results.StartDate.ToShortDateString();

     

但是这不会编译,它会给出错误&#34;运算符&#39; ==&#39;不能应用于类型&#39; System.DateTime&#39;的操作数。和&#39; System.DBNull&#39;。&#34;

它不起作用,因为results.StartDate是一个不可为空的日期时间,因此它必须始终具有值。它不是可选的(可空)。但是你试图将它与DBNull进行比较,因此编译器抱怨它不知道如何做到这一点。使results.StartDate可以为空,它会起作用。

答案 2 :(得分:0)

您没有指定DtReleases的收集类型。结果将与DtReleases中的任何元素具有相同的类型。

如果你看一下DtReleases的定义,你会发现DtReleases中的每个元素都是一个包含属性StartDate的类型的对象。

StartDate可能是DateTime还是DateTime? (替代方案:Nullable<DateTime>

如果它确实是DateTime,您可以放心,如果您的查询在运行时工作,您的结果将包含DateTime。

如果是DateTime?你应该在使用它之前检查它是否有值。每个可空类型都具有属性HasValue和Value:

if (results.StartDate.HasValue)
{
    lbStartDate.Text = results.StartData.Value.ToShortDateString();
}
else
{
    lsStartDate.Text = null;
}

新版本的C#有一个简写:

lbStartDate.Text = results.StartDate?.ToShortDateString();

如果开始日期有值,则表达式的结果将为此值ToShortDateString。否则表达式的结果将为null。

请参阅C# Null Conditional Operator