Новый вопрос 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?

7 ответов

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


Абсолютно - 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"));
}
</xmlelement>


Взгляните на 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);
}
</string></string>


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

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


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

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


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

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


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

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

licensed under cc by-sa 3.0 with attribution.