Возвращение всех остальных записей с помощью LINQ - PullRequest
2 голосов
/ 08 октября 2009

У меня есть запрос, который возвращает 10000 записей, которые используются в качестве точек на карте. В попытке снизить нагрузку и увеличить скорость приложения мы пытаемся реализовать логику Уровень детализации . Как правило, при уменьшении отображать 50% точек. При увеличении отобразите 100% точек.

В конечном итоге мне нужен итоговый SQL-код:

SELECT *
FROM 
    (SELECT 
        [t0].[RecordName], 
        [t0].[LastMaintenanceDate]
        ,Row_Number() OVER (ORDER BY [t0].Ticker) as RowNumber 
        FROM 
            [dbo].[TableName] AS [t0]
    )as [t1]
WHERE RowNumber % 2 = 0

В LINQ я могу использовать .Skip и .Take, чтобы получить часть Row_Number () Over ( пример здесь ), но при этом генерируемые критерии Where используют «между» вместо «где» RowNumber% 2 = 0 ", который мне нужен.

Правильно ли я подхожу к этому? Чтобы получить полный прирост производительности, который мы ищем здесь, это исключение действительно должно произойти на сервере SQL.

Ответы [ 2 ]

2 голосов
/ 08 октября 2009

Какие столбцы у вас в таблице? Если, например, у вас есть столбец первичного ключа для удостоверения личности int, вы можете использовать это ...

from mt in dc.MyTable
where mt.ID %2 == 0
select mt

... или ...

where mt.SomeDataTime.Millisecond % 2 == 0

... при этом где вы пытаетесь уменьшить нагрузку?

T-SQL в вашем посте, а также два упомянутых выше решения будут принудительно выполнять полное сканирование таблиц, поэтому, если ваша таблица имеет большой размер, было бы лучше, если бы вы сократили записи на основе чего-то индексированного где предикат предложения where может фактически использовать индекс) ...

0 голосов
/ 08 октября 2009

Проект morelinq имеет функцию TakeEvery , которая делает это, но это работает только в IEnumerable.

Должна быть возможность создать метод расширения для решения этой проблемы (в данный момент у меня нет доступной среды разработки, поэтому я не могу сейчас ее протестировать).

В вашем конкретном примере, я предполагаю, что метода расширения для Table будет достаточно.

Если вы хотите попробовать это, есть «пример» создания метода расширения для таблицы здесь .

...