Предварительный запрос с linq2sql для данных с разными знаками - PullRequest
0 голосов
/ 31 марта 2011

Допустим, у меня есть таблица с идентификатором, значением и отметкой времени. Отметка времени - это когда значение было вставлено в таблицу. Значение может быть положительным или отрицательным.

Как реализовать интеллектуальный запрос LINQ, который упорядочит эти данные по отметке времени и выберет только те из них, которые один за другим имеют разные знаки.

Например, если у меня есть значения:

1 2011-03-20 5
2 2011-03-21 6
3 2011-03-22 -3
4 2011-03-23 -4
5 2011-03-24 2

Я хочу получить только те, у кого id: 2,3, потому что это разные знаки и 4,5

Я мог бы получить их все и использовать их локально, но у меня есть более 1 миллиона таких значений.

1 Ответ

2 голосов
/ 31 марта 2011

Наличие непрерывного набора дат делает это намного проще. Вот запрос:

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...