实体框架按组跳过

AWe*_*eim 9 c# linq group-by

我目前通过一个表("Table1")"分页",其中包含以下字段{Policy,Name,Amount,Date},并且"Table1"中可以有多个记录,如下所示:

return context.Table1s.Orderby(i => i.Policy)
                      .Skip(endingRecord).Take(page)
                      .ToList();
Run Code Online (Sandbox Code Playgroud)

如果我想首先按策略分组然后跳过并采用不同的策略(基本上试图确保"页面"包含页面中包含的策略的所有记录),我将如何执行此操作?

我正在使用C#,实体框架,如果可能的话,更喜欢"lambda"语法.

Ser*_*kiy 7

return context.Table1s.GroupBy(i => i.Policy)
                      .Select(g => g.First())
                      .Orderby(i => i.Policy)
                      .Skip(endingRecord).Take(page)
                      .ToList();
Run Code Online (Sandbox Code Playgroud)

这会生成这样的SQL(从LinqPad到Linq到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]
Run Code Online (Sandbox Code Playgroud)