新手LINQ问题:在LINQ查询中分页可能吗?

时间:2008-12-08 20:42:09

标签: c# linq-to-xml

是否可以在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 个答案:

答案 0 :(得分:19)

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 :(得分: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"));
}

答案 2 :(得分: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 :(得分:3)

James Curran说得对,你可以通过创建一个扩展方法来简化它,以便以后重用。

您还可以修改代码,以返回一个对象,该对象可以跟踪列表中总共有多少项,以及基于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);

答案 4 :(得分:2)

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

这样,你正在跳过20个元素并接下来的10个

答案 5 :(得分:1)

“Take”和“Skip”扩展方法为此提供了这个。

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

答案 6 :(得分:1)

是的。您必须将XML转换为正确的DataSource格式,然后在MSDN论坛上的此线程应提供必要的步骤,以使您能够实现它...

MSDN - LINQ with pagination