Как обойти ошибку типа даты и времени Entity Framework? - PullRequest
1 голос
/ 30 декабря 2011

Я хочу получить все месячные продукты с истекшим сроком годности, вот запрос для этого:

_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.

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

Ответы [ 3 ]

1 голос
/ 31 декабря 2011

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

0 голосов
/ 30 декабря 2011

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

0 голосов
/ 30 декабря 2011

Вы пытались сделать так:

_customerProductsRepository
    .Where(
        d =>
        !d.ReleaseDate.HasValue &&
        (d.RenewalDate.HasValue ? 
              EntityFunctions.AddMonths(d.RenewalDate.Value, 1) < now) :
              EntityFunctions.AddMonths(d.AcquireDate, 1) < now))
    .ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...