【问题标题】:LINQ TO SQL Compare nullable date time in where conditionLINQ TO SQL 在 where 条件下比较可为空的日期时间
【发布时间】:2014-02-03 09:47:05
【问题描述】:

我正在使用 LINQ TO SQL。
以下是我用来从数据库中获取数据的代码。

contractMaintenances = mdbDataContext.ContractMaintenances
                         .Where(c => c.ContractID == contractId
                             && c.ChargeFrequencyID == periodFrequencyId
                             && c.FirstPeriodStartDate == (firstPeriodStartDate == null ? null : firstPeriodStartDate)
                             && c.FinalRenewalEndDate == (finalBillingPeriodEndDate.HasValue ? finalBillingPeriodEndDate : (DateTime?)null)
                             && c.IsDeleted == false).ToList();

上面的 FinalRenewalEndDate 在数据库中可以为空,所以如果 finalBillingPeriodEndDate 有值,则使用该值,否则为空。

但如果不工作,我在下面的 SQL 探查器中签入了探查器 SQL。

WHERE ([t0].[ContractID] = @p0) 
    AND ([t0].[ChargeFrequencyID] = @p1) 
    AND ([t0].[FirstPeriodStartDate] = @p2) 
    AND ([t0].[FinalRenewalEndDate] = @p3) 
    AND (NOT ([t0].[IsDeleted] = 1))',N'@p0 int,@p1 int,@p2 datetime,@p3 datetime',@p0=16422,@p1=4,@p2='2012-05-01 00:00:00',@p3=NULL

但如果我直接将空值与字段进行比较,那么它工作正常。

&& c.FinalRenewalEndDate == null

如果我直接传递 null 那么它将生成正确的输出。它不会在 SQL Profiler 中传递 p3 参数。

WHERE ([t0].[ContractID] = @p0) 
    AND ([t0].[ChargeFrequencyID] = @p1) 
    AND ([t0].[FirstPeriodStartDate] = @p2) 
    AND ([t0].[FinalRenewalEndDate] IS NULL) 
    AND (NOT ([t0].[IsDeleted] = 1))',N'@p0 int,@p1 int,@p2 datetime',@p0=16422,@p1=4,@p2='2012-05-01 00:00:00'

解决方法是什么。我有 3 个可选的日期参数。如果我找不到任何解决方案,那么我必须编写多个 if 条件来检查 null 参数,并且我不想编写这些条件。

【问题讨论】:

  • 可以直接写object.Equals(c.FinalRenewalEndDate,finalBillingPeriodEndDate)
  • 尝试将字段移动到三元运算符,如(finalBillingPeriodEndDate.HasValue ? (c.FinalRenewalEndDate == finalBillingPeriodEndDate) : (c.FinalRenewalEndDate == null))

标签: c# linq-to-sql


【解决方案1】:

尝试使用 object.Equals 代替相等运算符:

object.Equals(c.FinalRenewalEndDate, finalBillingPeriodEndDate.HasValue ? finalBillingPeriodEndDate : (DateTime?)null)

【讨论】:

  • 可以直接写object.Equals(c.FinalRenewalEndDate,finalBillingPeriodEndDate)
【解决方案2】:

也许您可以尝试在没有?: 运算符的情况下编写您的条件。

 && c.FinalRenewalEndDate == finalBillingPeriodEndDate

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多