我正在使用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参数,我不想写这些条件。
答案 0 :(得分:3)
尝试使用object.Equals而不是相等运算符:
object.Equals(c.FinalRenewalEndDate, finalBillingPeriodEndDate.HasValue ? finalBillingPeriodEndDate : (DateTime?)null)
答案 1 :(得分:0)
也许您可以尝试在没有?:
运算符的情况下编写条件。
&& c.FinalRenewalEndDate == finalBillingPeriodEndDate