【发布时间】: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