2013-03-15 8 views
7

以下のフィールド{ポリシー、名前、金額、日付}を持つテーブル( "Table1")を介して現在 "ページング"しています。以下のような政策、:Entity Framework skip take by group

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

私は(基本的に「ページが」のすべてのレコードが含まれていることを確認しようとしているポリシーによって最初のグループに望んでいたし、その後スキップして明確な方針を取る場合、私はこれをどのように行うだろうページに含まれているポリシー)?

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

+1

そのクエリを実行した後にグループ化(GroupBy)するだけで何が問題になりますか? – sergioadh

+0

2つのレコードを持つポリシーがあると#50000となり、もう1つ50001は50000でページすると50001のレコードが得られません。 – AWeim

答えて

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

この(LINQ to SQLのための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] 
+0

私は次のエラーが発生します - メソッド 'First'は最終的なクエリ操作としてのみ使用できます。代わりに、このインスタンスで 'FirstOrDefault'メソッドを使用することを検討してください。 – AWeim

+1

@WeemはEFのように提案します:)代わりにFirstOrDefaultを使用してください。各グループには少なくとも1つのアイテムがあるため、このケースでは違いはありません –

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

一度に1つのポリシーを実行する必要はありません。私はappox107000の方針を持っており、私は一度に10,000の方針のためのデータを返すことを望んでいました – AWeim

+0

心配しないでください...私はあなたが言っていることを知っていると思います...私はそれを試してみます – AWeim

+0

私はこれにエラーが発生しますエンティティへのLinqはSkipiWhileを再調整しません。エンティティフレームワーク – AWeim

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