LINQ TO SQL比较可以在哪里条件的可空日期时间

时间:2014-02-03 09:47:06

标签: c# linq-to-sql

我正在使用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有值,那么使用该值,否则为null。

但如果不能正常工作,我在下面的SQL Profiler中检查过的是探查器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

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

&& c.FinalRenewalEndDate == null

如果我直接传递null,那么它将生成正确的输出。它不会在SQL事件探查器中传递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参数,我不想写这些条件。

2 个答案:

答案 0 :(得分:3)

尝试使用object.Equals而不是相等运算符:

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

答案 1 :(得分:0)

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

 && c.FinalRenewalEndDate == finalBillingPeriodEndDate