Только что обновили с Subsonic 2.2 ActiveRecord до 3.0.0.3. Я пытаюсь использовать LINQ сделать постраничный Find запрос, как это (мой объект/таблица не называется «Repository»):Subsonic 3.0.0.3 SQL-пейджинг с использованием Linq
Repository.Find(item => item.DocumentTitle.Contains(searchTerm))
.OrderBy(i => i.DocumentTitle).Skip((currentPage - 1) * itemsPerPage)
.Take(itemsPerPage);
Когда я рассматриваю SQL, генерируемый этим запросом с помощью SQL Server Profiler, нет пейджинг в SQL, весь пейджинг выполняется в памяти на C#. Теперь у Subsonic-языка запросов есть хорошая процедура GetPaged, которая работает правильно, но я думал, что LINQ должен был это сделать. Я что-то пропустил или это ограничение LINQ?
Я знаю о функции Repository.GetPaged()
, но у меня недостаточно параметров - мне нужно сделать динамический сортировку, а также Find()
.
Сделал еще больше исследований. По-видимому, это связано с тем, как C# компилирует выражение linq. Компилятор должен знать во время разработки, какое будет утверждение. Если это не так, утверждение не может быть отражено SubSonic «ExpressionVisitor» (это не уникально для SubSonic), потому что это уже не одно «выражение». – Steve
Существуют библиотеки сторонних разработчиков, которые позволят вам создать ваш оператор linq несколькими шагами, но это добавит больше внешних зависимостей к вашему проекту. На данный момент у SubSonic есть некоторые из этих функций, но на данный момент я недостаточно знаю, поэтому предлагаю использовать их для этого. – Steve