C# 实体框架按组跳过
I当前通过一个表(“表1”)进行“分页”,该表具有以下字段{Policy,Name,Amount,Date},并且一个策略的“表1”中可以有多个记录,如下所示:C# 实体框架按组跳过,c#,linq,group-by,C#,Linq,Group By,I当前通过一个表(“表1”)进行“分页”,该表具有以下字段{Policy,Name,Amount,Date},并且一个策略的“表1”中可以有多个记录,如下所示: return context.Table1s.Orderby(i => i.Policy) .Skip(endingRecord).Take(page) .ToList(); 如果我想先按策略分组,然后跳过并采用不同的策略(基本上是试图确保“
return context.Table1s.Orderby(i => i.Policy)
.Skip(endingRecord).Take(page)
.ToList();
如果我想先按策略分组,然后跳过并采用不同的策略(基本上是试图确保“页面”包含页面中包含的策略的所有记录),我该如何做
我使用的是C#,实体框架,如果可能的话,我更喜欢“lambda”语法。您可以使用
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();
生成如下SQL(来自LinqPad的示例,用于Linq到SQL):
下面给出了我想要的结果
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();
在执行该查询后将它们分组(GroupBy)有什么错?因为如果我有一个策略有两条记录,一条记录为50000,另一条记录为50001,如果我按50000分页,我就不会得到记录50001,我想要它。我不想一次执行一条策略。我有大约107000个策略,我想一次返回10000个策略的数据,不要紧……我想我知道你在说什么……我会尝试一下……我得到一个错误,Linq to Entities无法重新识别SkipiWhile……我使用的是实体框架WorkInQ to Entities,当你使用Linq with ENTITITY Framework查询数据时。我将使用可能的解决方案进行编辑。我得到以下错误-方法“First”只能用作最终查询操作。考虑在这个实例中使用方法“FrestSturrest'”。每个组将至少有一个项目,因此在本地评估的条件下,该案例组没有差异
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]
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();