2008-12-08 87 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

by linq的分页是可能的。我不知道你想达到什么目的。如果在xml文件中保存了大量记录,并且您想通过分页获取 linq的数据,那么这是不可能的。大多数时候人们使用xml doc类来读取xml文件,然后将完整的xml数据加载到内存中。当完整的数据加载到内存中时,不应将其视为分页。 LINQ只会从内存中读取少量数据并返回........但这不能称为分页。分页意味着我只会将少量数据加载到内存中,而我将要显示或使用该内存。 – Thomas 2015-07-31 19:39:56

回答

18
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); 
+1

对于第二种情况,使用扩展方法可能更容易,而不是混合使用语言语法:var q = Choices.Where(x => x.SomeField == SomeValue).Skip((page - 1)* pageSize ).Take(pageSize); – 2008-12-09 00:25:47

+0

在第一种情况下,您可以删除`from X in`和`select X`。 – 2010-08-02 07:54:14

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

这样一来,你跳过20个元素,并采取在未来10

1

的“取”和“跳过”扩展方法提供了这一点。

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

绝对 - Skip()Take()实现分页,和漂亮,很多都支持LINQ提供商。

在这种情况下,它看起来像使用LINQ-to-Xml,因此可以忽略以下几点 - 但对于一般信息:请注意,如果数据通过存储过程从数据库传出,则很难在服务器上进行分页。但是,您可以撰写(即页面)“UDF”。 LINQ-to-SQL支持UDF(通过[FunctionAttribute]),但不支持实体框架。如果您使用自动生成的数据库查询,这不是一个问题。

需要注意的是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")); 
} 
1

是的,它是。你必须得到XML转换为正确的数据源格式,然后这个线程在在MSDN论坛上应当提供必要的步骤,给你如何实现它的能力......

MSDN - LINQ with pagination

3

取看看Queryable.SkipQueryable.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);