2008-12-08 90 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);