Новый вопрос LINQ: возможен ли пейджинг в запросах LINQ?

Возможно ли использовать функции "подкачки" в запросах 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?

Ответы

Ответ 1

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);

Ответ 2

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

В этом случае похоже, что вы используете LINQ-to-Xml, поэтому можете игнорировать следующий бит - но для общей информации: обратите внимание, что если данные поступают из базы данных через хранимую процедуру, это сложно на страницу на сервере. Однако вы можете составить (например, страницу) "UDF". 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"));
}

Ответ 3

Взгляните на Queryable.Skip и Queryable. Возьмите методы.

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

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

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);
}

Ответ 4

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

Вы также можете изменить код, чтобы вернуть вам объект, который может отслеживать количество элементов в списке и сколько страниц должно быть основано на 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);

Ответ 5

var pagedData = aDataSource.Skip(20).Take(10);

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

Ответ 6

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

myQueryable = myQueryable.Skip(10).Take(10);

Ответ 7

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

MSDN - LINQ с разбиением на страницы