11

現在、次のフィールド {ポリシー、名前、金額、日付} を持つテーブル (「テーブル 1」) を「ページング」しており、次のように、ポリシーの「テーブル 1」に複数のレコードが存在する可能性があります。

return context.Table1s.Orderby(i => i.Policy)
                      .Skip(endingRecord).Take(page)
                      .ToList();

最初にポリシーでグループ化し、次にスキップして個別のポリシーを取得したい場合 (基本的に、ページに含まれるポリシーのすべてのレコードが「ページ」に含まれていることを確認しようとします)、これを行うにはどうすればよいですか?

私は C# エンティティ フレームワークを使用しており、可能であれば「ラムダ」構文を使用しています。

4

3 に答える 3

9
return context.Table1s.GroupBy(i => i.Policy)
                      .Select(g => g.First())
                      .Orderby(i => i.Policy)
                      .Skip(endingRecord).Take(page)
                      .ToList();

これにより、次のようなSQLが生成されます(LinqのLinqPadからSQLへのサンプル)。

SELECT [t4].[test], [t4].[Name], [t4].[Policy], [t4].[Amount], [t4].[Date]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t3].[Policy]) AS [ROW_NUMBER], [t3].[test], [t3].[Name], [t3].[Policy], [t3].[Amount], [t3].[Date]
    FROM (
        SELECT [t0].[Policy]
        FROM Table1s AS [t0]
        GROUP BY [t0].[Policy]
        ) AS [t1]
    OUTER APPLY (
        SELECT TOP (1) 1 AS [test], [t2].[Name], [t2].[Policy], [t2].[Amount], [t2].[Date]
        FROM Table1s AS [t2]
        WHERE (([t1].[Policy] IS NULL) AND ([t2].[Policy] IS NULL)) OR (([t1].[Policy] IS NOT NULL) AND ([t2].[Policy] IS NOT NULL) AND ([t1].[Policy] = [t2].[Policy]))
        ) AS [t3]
    ) AS [t4]
WHERE [t4].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t4].[ROW_NUMBER]
于 2013-03-15T18:00:49.977 に答える
1

以下は私に望ましい結果を与えました

   return context.Tables1
                .Where(i =>
                    context.Tables1
                    .GroupBy(t => t.Policy)
                    .OrderBy(t => t.Key)
                    .Skip(previousRecordCount).Take(page)
                    .Select(t => t.Key)
                    .Contains(i.Policy))
                    .ToList();
于 2013-03-15T18:51:22.373 に答える
0

SkipWhileメソッドとメソッドを使用できますがTakeWhile、次のように分離する必要があります。

var policyStart = context.Table1s.Orderby(i => i.Policy).ToList().SkipWhile(i => i.Policy == endingRecord.Policy);
var firstPolicy = policyStart.FirstOrDefault().Policy;
return policyStart.TakeWhile(i => i.Policy == firstPolicy).ToList();
于 2013-03-15T17:54:42.213 に答える