1

Я хочу, чтобы получить все ежемесячные просроченные продукты, вот запрос для этого:Как работать с ошибкой типа времени объекта Entity Framework?

_customerProductsRepository 
    .Where(
     d => 
     !d.ReleaseDate.HasValue && 
     EntityFunctions.AddMonths(d.RenewalDate ?? d.AcquireDate, 1) < now) 
    .ToArray(); 

AcquireDate является первой покупкой продукта и RENEWALDATE является последним обновлением продукта.

По какой-то причине он переводит на этот SQL:

SELECT 
[Extent1].[CustomerDidId] AS [CustomerDidId], 
[Extent1].[DidNumber] AS [DidNumber], 
[Extent1].[CountryId] AS [CountryId], 
[Extent1].[CustomerId] AS [CustomerId], 
[Extent1].[AcquireDate] AS [AcquireDate], 
[Extent1].[ReleaseDate] AS [ReleaseDate], 
[Extent1].[RenewalDate] AS [RenewalDate], 
[Extent1].[RenewalNotificationDate] AS [RenewalNotificationDate] 
FROM [dbo].[CustomerDids] AS [Extent1] 
WHERE ([Extent1].[ReleaseDate] IS NULL) AND ((DATEADD (month, 1, [Extent1].[Rene 
walDate])) < @p__linq__0) 

Там должно быть случай, заявление со ссылкой на «??» вместо этого - это полностью удаленный столбец AcquireDate.

Как я могу обойти это?

+1

Вы настроили свойство 'RenewalDate' по мере необходимости? – Eranga

+0

Вы пытались изменить '??' на '? : 'оператор? – Reniuz

+0

Обратите внимание, что настоящая проблема заключается в том, что нулевой коалесцирующий оператор '??' обрабатывается не так, как вы ожидаете, и переводится в TSQL 'case'. На самом деле это не относится к типу 'DateTime' вообще. См. Мой ответ. –

ответ

1

При необходимости вы создали свойство RenewalDate. Следовательно, EF оптимизирует запрос, оценивая результат условия «if».

0

Вы пробовали сделать это так:

_customerProductsRepository 
    .Where(
     d => 
     !d.ReleaseDate.HasValue && 
     (d.RenewalDate.HasValue ? 
       EntityFunctions.AddMonths(d.RenewalDate.Value, 1) < now) : 
       EntityFunctions.AddMonths(d.AcquireDate, 1) < now)) 
    .ToArray(); 
+0

Я не уверен, что тройной оператор будет лучше, чем оператор нулевой коалесценции, при переходе на TSQL. Если это так, то этот ответ должен отлично работать и более краток, чем мой. –

+0

Не работает, мой WHERE теперь: WHERE ([Extent1]. [ReleaseDate] IS NULL) AND ((CASE WHEN ((DATEADD (месяц, 1, [Ex tent1]. [RenewalDate])) < @ p__linq__0) THEN cast (1 как бит) WHEN (NOT ((DATEADD ( месяц, 1, [Extent1]. [RenewalDate])) <@ p__linq__0)) THEN cast (0 как бит) END) = 1 ) –

0

Один сценарий, если вы не можете получить эту работу, как IQueryable, получить все данные как IEnumerable (назовем asEnumerable), а затем отфильтровать через которые вы указываете.

+0

Конечно, вы можете это сделать, но это побеждает цель в моем случае. –

Смежные вопросы