Наличие непрерывного набора дат делает это намного проще. Вот запрос:
IQueryable<YourType> dates = ...;
var result = dates
.Join(dates, d => d.TimeStamp.AddDays(1),
d => d.TimeStamp,
(d1, d2) => new {d1, d2})
.Where(p => p.d1.Value * p.d2.Value < 0);
Я проверил это локально, и оно работает. Вот запрос, который отправляется на сервер SQL:
exec sp_executesql N'SELECT [t0].[id], [t0].[TimeStamp], [t0].[Value], [t1].[id] AS [id2], [t1].[TimeStamp] AS [TimeStamp2], [t1].[Value] AS [Value2]
FROM [dbo].[Dates] AS [t0]
INNER JOIN [dbo].[Dates] AS [t1] ON DATEADD(ms, (CONVERT(BigInt,@p0 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,@p0 * 86400000)) / 86400000, [t0].[TimeStamp])) = [t1].[TimeStamp]
WHERE ([t0].[Value] * [t1].[Value]) < @p1',N'@p0 float,@p1 int',@p0=1,@p1=0