Различные результаты Linq to Sql в зависимости от того, связаны ли методы вместе - PullRequest
1 голос
/ 08 июня 2011

Я изучаю Linq-to-Sql и сталкиваюсь со сценарием, в котором я пытаюсь построить динамический запрос с сортировкой, фильтрацией и разбиением на страницы.

Если я запускаю запрос, напримерэто я могу получить «постраничные» результаты:

IQueryable<WorkOrder> query = (_dataContext.WorkOrders).Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();

в этом случае сгенерированный запрос выглядит следующим образом:

SELECT <columns>
FROM (
    SELECT ROW_NUMBER() OVER (<columns>) AS [ROW_NUMBER], <columns>
    FROM [dbo].[WorkOrders] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]

Однако, если я запускаю запрос, как это, этобольше не разбирается на страницы:

IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();

В этом случае сгенерированный запрос выглядит следующим образом:

SELECT <cut for brevity>
FROM [dbo].[WorkOrders] AS [t0]

Я не могу понять, что здесь происходит ... именно тогда, когда LinqSql сгенерировать запрос, и возможно ли добавить дополнительные критерии, такие как Skip, Take, OrderBy, к существующему IQueryable?Где бы я хотел оказаться, было бы что-то вроде этого:

IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
if (User.IsNotAuthorizedToSeeSomething) {
    query.Where(...);
}
if (search.sortField.Equals("Name")) {
    query.OrderBy(...);
}
query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

вместо

IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();

попробовать

IQueryable<WorkOrder> query = (_dataContext.WorkOrders);
query = query.Skip((search.page - 1) * search.rows).Take(search.rows);
var retval = query.ToList();

каждый запрос. Xxx () не применяет Xxx к объекту запроса, но возвращает новый объект.

0 голосов
/ 08 июня 2011

Похоже, что во втором случае он выполняет и выполняет запрос к базе данных при выполнении первой строки. Skip и Take затем выполняются как LINQ to Objects, а не LINQ to SQL.

Я не совсем уверен, почему он это сделал, хотя ...

Значения retval выглядят одинаково в обоих случаях. (Это должно произойти, если то, что я думаю, происходит на самом деле.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...