Новичок LINQ Вопрос: возможно ли разбиение на страницы в запросах LINQ? - PullRequest
14 голосов
/ 08 декабря 2008

Возможно ли использование функции «подкачки» в запросах Linq? Допустим, у меня есть какой-то XML, подобный этому:

<Root>
    <BetaSection>
        <Choices>
            <SetA>
                <Choice id="choice1">Choice One</Choice> 
                <Choice id="choice2">Choice Two</Choice>
                <Choice id="choice3">Choice Three</Choice>
                .
                .
                .
                <Choice id="choice48">Choice Forty-Eight</Choice>
                <Choice id="choice49">Choice Forty-Nine</Choice>
                <Choice id="choice50">Choice Fifty</Choice>
            </SetA>
        </Choices>
    </BetaSection>
</Root>

Если бы я хотел реализовать функциональность подкачки, смогу ли я предоставить смещение для запроса LINQ, чтобы я мог начать с 11-го элемента и закончить с 20-м элементом? Если это так, будет ли запрос другим, если данные представляют собой список объектов вместо XML?

Ответы [ 7 ]

19 голосов
/ 08 декабря 2008
var q = from X in Choices.Skip((page-1)*pageSize).Take(pageSize)
        select X;

Теперь, если вам нужно выражение where, оно становится немного сложнее:

var q = (from X in Choices
         where x.SomeField == SomeValue
         select X).Skip((page-1)*pageSize).Take(pageSize);
3 голосов
/ 09 декабря 2008

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

Вы также можете изменить код так, чтобы он возвращал вам объект, который может отслеживать, сколько всего элементов в списке и сколько страниц должно быть на основе pageSize и pageIndex.

public static IQueryable<T> ToPageOfList<T>(this IQueryable<T> source, int pageIndex, int pageSize)
{
    return source.Skip(pageIndex * pageSize).Take(pageSize);
}

//Example
var g = (from x in choices select x).ToPageOfList(1, 20);
3 голосов
/ 08 декабря 2008

Ознакомьтесь с методами Queryable.Skip и Queryable.Take .

Также посмотрите это полезное методы расширения для подкачки,

с помощью этих методов вы можете сделать это следующим образом:

List<string> names = new List<string>();
names.AddRange(new string[]{"John","Frank","Jeff","George","Bob","Grant", "McLovin"});

foreach (string name in names.Page(2, 2))
{
    Console.WriteLine(name);
}
3 голосов
/ 08 декабря 2008

Абсолютно - Skip() и Take() достигают пейджинга и поддерживаются практически всеми провайдерами LINQ.

В этом случае похоже, что вы используете LINQ-to-XML, поэтому не стесняйтесь игнорировать следующий бит - но для общей информации: обратите внимание, что если данные поступают из базы данных через хранимую процедуру, это сложно на страницу на сервере. Вы можете, однако, составить (то есть страницу) "UDF" s. LINQ-to-SQL поддерживает UDF (через [FunctionAttribute]), но не Entity Framework. Если вы используете автоматически сгенерированные запросы к базе данных, это не проблема.

Обратите внимание, что с xml вы также можете многое сделать с xpath - здесь используйте XmlDocument:

foreach (XmlElement el in doc.SelectNodes(
  "/Root/BetaSection/Choices/SetA/Choice[position() > 11 and position() < 20]"))
{
    Console.WriteLine(el.GetAttribute("id"));
}

или с Skip() / Take() (все еще с XmlDocument):

foreach (var el in doc.SelectNodes(
  "/Root/BetaSection/Choices/SetA/Choice").Cast<XmlElement>()
  .Skip(10).Take(10))
{
    Console.WriteLine(el.GetAttribute("id"));
}
2 голосов
/ 08 декабря 2008
var pagedData = aDataSource.Skip(20).Take(10);

Таким образом, вы пропускаете 20 элементов и берете следующие 10

1 голос
/ 08 декабря 2008

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

MSDN - LINQ с нумерацией страниц

1 голос
/ 08 декабря 2008

Для этого предусмотрены методы расширения "Take" и "Skip".

myQueryable = myQueryable.Skip(10).Take(10);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...