是否可以在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,那么查询是否会有所不同?
答案 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.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 :(得分: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论坛上的此线程应提供必要的步骤,以使您能够实现它...