14

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>

ページング機能を実装したい場合、11 番目の要素で開始し、20 番目の要素で終了するように、LINQ クエリにオフセットを提供できますか? もしそうなら、データが XML ではなくオブジェクトのリストだった場合、クエリは何か違うでしょうか?

4

7 に答える 7

20
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);
于 2008-12-08T20:46:58.690 に答える
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);
于 2008-12-08T21:01:29.080 に答える
3

絶対に -ページングSkip()Take()実現し、ほぼすべての LINQ プロバイダーでサポートされています。

この場合、LINQ-to-Xml を使用しているように見えるので、次の部分は無視してかまいませんが、一般的な情報として: データがストアド プロシージャを介してデータベースから取得されている場合、ページングが難しいことに注意してください。サーバー。ただし、「UDF」を作成 (つまり、ページ化) することはできます。LINQ-to-SQL は ( 経由で[FunctionAttribute]) UDF をサポートしますが、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"));
}
于 2008-12-08T20:47:15.240 に答える
3

Queryable.SkipおよびQueryable.Takeメソッドを見てください。

ページングの この便利な拡張メソッドも参照してください。

そのメソッドを使用すると、次のように実行できます。

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);
}
于 2008-12-08T20:47:26.893 に答える
2
var pagedData = aDataSource.Skip(20).Take(10);

そうすれば、20 要素をスキップして、次の 10 要素を取得します。

于 2008-12-08T20:46:04.510 に答える
1

「Take」および「Skip」拡張メソッドがこれを提供します。

myQueryable = myQueryable.Skip(10).Take(10);
于 2008-12-08T20:46:54.430 に答える
1

はい、そうです。XML を適切な DataSource 形式に変換する必要があります。その後、MSDN フォーラムのこのスレッドで、実装方法を理解するために必要な手順が提供されるはずです...

MSDN - ページネーションを使用した LINQ

于 2008-12-08T20:47:26.007 に答える