2013-03-15 25 views
7

tarafından alın Şu anda bir tablo ("Tablo1") aşağıdaki alanları {Policy, Name, Amount, Date} içeren "paging" ve "Tablo1" de çok sayıda kayıt olabilir. politika gibi aşağıdaki:Entity Framework atlamak, grup tarafından

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

ben politikası tarafından ilk grup istedim ve sonra atlamak ve temelde bir "sayfa" için tüm kayıtları içerdiğinden emin olmak için çalışıyorum (farklı politikaları almak bunu yapacağını nasıl olursa sayfada yer alan politikalar)?

C#, varlık çerçevesi kullanıyorum ve mümkünse "lambda" sözdizimini tercih ediyorum.

+1

Bu sorguyu yaptıktan sonra bunları gruplamakla ilgili sorun nedir? – sergioadh

+0

Çünkü iki kayıt içeren bir ilkem varsa, biri 50000, diğeri 50001, 50000'e kadar sayfayı kaydedersem, 50001 kayıt alamayacağım ve bunu istiyorum. – AWeim

cevap

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

:

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

Folloiwng hatasını alıyorum - 'First' yöntemi yalnızca bir son sorgu işlemi olarak kullanılabilir. Bunun yerine, bu örnekte 'FirstOrDefault' yöntemini kullanmayı düşünün. – AWeim

+1

@AWeim, EF önerilerini önerir :) Bunun yerine FirstOrDefault öğesini kullanın. Her grupta en az bir öğe olacak, bu yüzden bu durumda bir fark yoktur. –

0

Sen SkipWhile ve TakeWhile yöntemleri kullanmak, ancak aşağıdaki gibi bunu ayırmak gerekir:

bu (LINQPad gelen Linq to SQL örnek) gibi SQL oluşturur
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

Tek seferde bir politika yapmak istemiyorum. 107.000 poliçe uygulamam var ve 10,000 politika için veriyi bir seferde vermek istedim. – AWeim

+0

Bunu boşver ... Sanırım ne dediğini biliyorum ... Denemeye çalışacağım – AWeim

+0

Bu konuda bir hata alıyorum Varlık Linq varlıklar için SkipiWhile ... Varlık çerçeve kullanıyorum – AWeim

1

şu bana verdi istenen sonuçlar

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