DevExpress MVC Gridview + LINQ - PullRequest
       4

DevExpress MVC Gridview + LINQ

1 голос
/ 25 января 2012

У нас есть вид сетки DX, отображаемый в специально разработанном виде.Мы передаем предопределенный объект ViewModel, значения которого заполняются из запроса Linq-2-Entities.Проблема в том, что в нашей функции обратного вызова запрос L2E фактически выполняется на БД до того, как сетка DevExpress выполнит фильтрацию, сортировку и разбиение по страницам.IE .: (упрощенный пример, в реальной ситуации мы выбираем данные из нескольких таблиц, но все еще в одном запросе linq)

public ActionResult GridViewPartial(string myParameters) 
{
    var modelData = from s in db.myTable 
                                     select new { modelName = s.Name };

    return PartialView("GridViewPartial", modelData);
}

В этой ситуации запрос фактически выполняется до того, как данные были переданы вПосмотреть.Поэтому он фактически выбирает слишком много данных из БД, в то время как в виде сетки отображается только выбранная страница.

Как бы нам пришлось изменить запрос, чтобы он выбирал только данные страницы, которую выбрал пользователь?IE.пропустить 10 строк и взять 10 в запросе L2E, когда пользователь выбирает страницу 2, вместо выбора 100000 строк (если их так много в таблице) и затем применяет фильтрацию / сортировку / разбиение по страницам, как в описанной ситуации?

Ответы [ 3 ]

4 голосов
/ 26 января 2012

Расширение MVC GridView поддерживает так называемый « режим сервера » функционально через внутренний LinqServerModeDataSource объект.

Требуется IQueryable объект в качестве источника данных:

Прямой запрос LINQ:

http://www.devexpress.com/issue=Q333116

@Html.DevExpress().GridView(...).BindToLINQ(string.Emptry, string.Emptry, (s, e) => { e.KeyExpression = Key_Column_Here; e.QueryableSource = Linq_Query_Here; }

Таблица / представление из LinqToX DataCotnext / Classes ;

http://mvc.devexpress.com/GridView/DataBindingToLargeDatabase

@Html.DevExpress().GridView(...).BindToLINQ(Data_Context_Name_Here, Table_View_Name_Here).GetHtml()
3 голосов
/ 26 января 2012

Похоже, что тип объекта должен иметь System.Linq.IQueryable для того, чтобы представление сетки DevExpress могло эффективно использовать свои команды DB Linq.Внутри вашего контроллера создайте свою логику и передайте свой запрос Linq представлению:

System.Linq.IQueryable modelData = from s in db.myTable 
                                 select new { modelName = s.Name };

return PartialView("GridViewPartial", modelData);

В представлении Razor запустите просмотр сетки с помощью команды:

@model System.Linq.IQueryable
@Html.DevExpress().GridView(...).BindToLINQ((string)null, null, (s, e) => { e.KeyExpression = "Table_id"; e.QueryableSource = Model;})
1 голос
/ 25 января 2012

Я бы реализовал разбиение на страницы / сортировку / фильтрацию на уровне / уровне доступа к данным и возвращал только то, что нужно показать, потому что Grid, как вы заметили, может показать нужную страницу, но это происходит на стороне клиента, и все всегда загружается из базу данных, за исключением случаев, когда вы используете их XPO ORM (что я не делаю) и включаете режим сервера сетки (по крайней мере, это понятие в их формах окон и ASP.NET Grid).

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

...