2008-12-08 1 views
13

Возможно ли использовать функции пейджинга в запросах Linq? Скажем, у меня есть некоторые XML, как это:Новый вопрос LINQ: возможен ли пейджинг в запросах LINQ?

<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?

+0

pagination by linq возможен. я не знаю, чего вы пытаетесь достичь.если в файле xml есть огромные записи, и вы хотите получить данные оттуда linq с разбивкой по страницам, тогда это невозможно. большую часть времени люди используют класс xml doc для чтения xml-файла, а затем полную загрузку данных xml в память. это не следует рассматривать как разбиение на страницы при полной загрузке данных в память. linq будет просто читать несколько данных из памяти и возвращать ........ но это нельзя сказать как pagination.pagination означает, что я загружу только несколько данных в память, которые я собираюсь показать или работать. – Thomas

ответ

18
var q = from X in Choices.Skip((page-1)*pageSize).Take(pageSize) 
     select X; 

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

var q = (from X in Choices 
     where x.SomeField == SomeValue 
     select X).Skip((page-1)*pageSize).Take(pageSize); 
+1

Для вашего второго случая, вероятно, проще просто использовать методы расширения, а не смешивать в синтаксисе языка: var q = Choices.Where (x => x.SomeField == SomeValue) .Skip ((страница - 1) * pageSize) .Take (pageSize); –

+0

В первом случае вы можете удалить 'from X in' и' select X'. –

+1

Будет ли это работать при применении orderby? Я имею в виду, что Linq должен сначала применить orderby, а затем пропустить и принять ... – Andry

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

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

1

«Take» и «Пропустить» методы расширения обеспечивают для этого.

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

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

Я видел ваш код, но когда мы работаем с классом xmldoc для загрузки и чтения xml-файла, сначала загружаем все данные в память. если все данные загружаются в память и выбирают несколько оттуда с помощью функции пропуска и приема ... действительно ли это считается разбиением на страницы? pagination означает, что я загружу только несколько данных в память, которые я собираюсь показать или работать. – Thomas

1

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

MSDN - LINQ with pagination

3

Take посмотрите на методы Queryable.Skip и Queryable.Take.

Также смотрите полезную extension methods для пейджинга,

с того, что методы, которые вы можете сделать это так:

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^