2013-03-15 56 views
7

我通过一个表格(“Table1”)具有以下字段{Policy,Name,Amount,Date},并且在“Table1”中可以有多个记录政策,如下所示:实体框架跳过分组由

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

我会怎么做,如果我想第一组的策略,然后跳过,并就不同的政策(主要是努力确保“页”包含了所有的记录包含在页面中的政策)?

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

+1

在完成该查询后将它们分组(GroupBy)有什么问题? – sergioadh 2013-03-15 17:54:26

+0

,因为如果我有一个有两条记录的策略,其结果是#50000,另一个50001,如果我的页面是50000,我不会得到记录50001,我想要它。 – AWeim 2013-03-15 18:33:31

回答

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

这产生这样的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] 
+0

我得到以下错误 - 方法'First'只能用作最终查询操作。请考虑在此实例中使用方法“FirstOrDefault”。 – AWeim 2013-03-15 18:33:50

+1

@AWeim喜欢EF建议:)改用FirstOrDefault。每组至少有一个项目,所以在这种情况下没有区别 – 2013-03-15 18:52:07

0

您可以使用SkipWhileTakeWhile方法,但是你需要分开,如下所示:

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(); 
+0

我不想一次执行一项政策。我有appox 107,000个政策,我想一次返回10000个政策的数据 – AWeim 2013-03-15 17:58:26

+0

不要紧,我想我知道你在说什么......我会试试 – AWeim 2013-03-15 17:59:55

+0

我得到一个错误Linq to Entities不重构SkipiWhile ...我使用的是实体框架 – AWeim 2013-03-15 18:30:20

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();