Новый вопрос 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 с разбиением на страницы