Как перевести расчеты TimeSpan в SQL через LINQ - PullRequest
0 голосов
/ 15 января 2019

У меня есть объект со свойством TimeSpan (Start) и свойством int (Duration in minutes ).

Я хочу выполнить запрос linq, который извлечет все строки, относящиеся к следующей логике:

Start <= DateTime.Now <= Start + Duration

Мой LINQ

from n in _context.Notifications
where n.Start <= DateTime.Now.TimeOfDay && DateTime.Now.TimeOfDay <= n.Start.Add(new TimeSpan(0, n.Duration, 0))
select n;      

переводится в (как взято из SQL Server Profiler)

SELECT [n].[Id], [n].[Active], [n].[Created], [n].[Day], [n].[Duration], [n].[Name], [n].[Start], [n].[Type]
FROM [Notifications] AS [n]
WHERE [n].[Start] <= CAST(GETDATE() AS time)

Предупреждение, которое я получаю от EntityFramework Core:

Microsoft.EntityFrameworkCore.Query: Предупреждение: выражение LINQ 'где (DateTime.Now.TimeOfDay <= [n] .Start.Add (new TimeSpan (0, [n] .Duration, 0))) '> не удалось перевести и будет оцениваться локально.

SQL-запрос, который мне нужен, это

SELECT [n].[Id], [n].[Active], [n].[Created], [n].[Day], [n].[Duration], [n].[Name], [n].[Start], [n].[Type]
FROM [Notifications] AS [n]
WHERE CAST(GETDATE() AS TIME) BETWEEN [n].[Start] AND DATEADD(MINUTE, [n].[Duration], [n].[Start])

1 Ответ

0 голосов
/ 15 января 2019

Простое решение: не запускать вычисления как часть запроса LINQ. Сначала выполните временной интервал, затем запустите 2 экземпляра datetiime в качестве параметров. Готово.

...