2009-04-23 31 views
9

LINQ To SQL ile bir süredir .Skip() ve .Take() uzantı yöntemlerini kullanıyorum, ancak hiç kullanmadığım tüm durumlarda, her zaman tek bir tablo - örneğin:LINQ To SQL Paging

database.Users.Select(c => c).Skip(10).Take(10); 

Benim sorun ben şimdi birden fazla tablodan sonuçları grubunu projelendirme ediyorum ve istediğim sayfaya genel sette (ve hala db çağrı faydalanmak) olmasıdır .

Benim varlık modeli şöyle görünür:

bir kampanya [sahiptir birçok] grup, bu

gibi veritabanındaki bir ilişki aracılığıyla modellenmiştir

bir grup [sahiptir birçok] kişi Kampanya -> CampaignToGroupMapping -> Group -> GroupToContactMapping -> Temas

Veri yapısı oluşturmak istiyorum ho ho lding ben içine her gruptan kişileri kümesini proje .SelectMany kullanarak bir LINQ sorgusu yazmaya çalıştı

Campaign 
    CampaignName 
    CampaignFrom 
    CampaignDate 
    Recipients 
     Recipient 1 
     Recipient 2 
     Recipient n... 

da bir kampanyanın detayları ve CampaignToGroupMapping aracılığıyla kampanyaya ilişkili her kişi listesi, yani Bir lineer veri seti, umarım .Skip() .Take() bundan yapabilirim.

girişimim oldu:

var schedule = (from c in database.Campaigns 
       where c.ID == highestPriority.CampaignID 
       select new PieceOfCampaignSchedule 
       { 
        ID = c.ID, 
        UserID = c.UserID, 
        Name = c.Name, 
        Recipients = c.CampaignGroupsMappings.SelectMany(d => d.ContactGroup.ContactGroupMappings.Select(e => new ContactData() { /*Contact Data*/ }).Skip(c.TotalSent).Take(totalRequired)).ToList() 

       }).SingleOrDefault(); 

sorun sayfalama (açısından atla() ve atın() kadar) her bir grup değil, tüm veri seti için oluyor olmasıdır. I (sökünüz() iletilen) totalRequired parametrenin değerini 200 kullanımı durumunda

Bu

anlamına gelir ve her gruptan 200 alacak bu kampanya ile ilgili 3 gruplara sahip - toplam verilerinden değil 200 Kampanyayla ilişkilendirilen her gruptan. Bu sorgu ile

select * from 
(
    select [t1].EmailAddress, ROW_NUMBER() over(order by CampaignID desc) as [RowNumber] from contacts as [t1] 
    inner join contactgroupmapping as [t2] on [t1].ID = [t2].ContactID 
    inner join campaigngroupsmapping as [t3] on [t3].ContactGroupID = [t2].GroupID 
    where [t3].CampaignID = @HighestPriorityCampaignID 

) as [Results] where [Results].[RowNumber] between 500 and 3000 

Ben özel kampanya ile ilişkili her gruptan kişileri kombine kümesi üzerinden çağrı ediyorum:

SQL, ben gibi bir sorgu ile bunu başarabilir. Bu yüzden sorum şu, bunun yerine LINQ To SQL sözdizimini kullanarak bunu nasıl başarabilirim?

cevap

0

birden çok tablodan sonuçlarını toplamak için bir görünümünü kullanın ve sonra bunu yapacağını sağlanan SQL sorgusu taklit etmek görünüm

+0

İdeal olarak, sadece LINQ To SQL kullanarak bir çözüm arıyordum. Cevabımda bahsettiğim gibi, SQL sorgusunu doğrudan ADO.NET'ten de çalıştırabilirim - ancak LINQ To kullanmak istedim Diğer kodlarla tutarlılık için SQL.Önceki soru için teşekkürler: – Martin

+1

LINQ to SQL, görüntülemeyi destekler. Sadece onları sürükleyip tasarımcıya bırakın. LINQ to SQL çözümünü istediğinizi anladım. LINQ to SQL framework tarafından – rguerreiro

4

üzerinde LINQ kullanmak:

var schedule = (from t1 in contacts 
       join t2 in contactgroupmapping on t1.ID equals t2.GroupID 
       join t3 in campaigngroupsmapping on t3.ContactGroupID = t2.GroupID 
       where t3.CampaignID = highestPriority.CampaignID 
       select new PieceOfCampaignSchedule 
       { 
        Email = t1.EmailAddress 
       }).Skip(500).Take(2500).ToList() 

sayfa çalışıyorsun kampanyalar, alıcılar veya ikisi birden mi?

+0

Atla ve Al kullanmadan önce sipariş vermeniz gerektiğine inanıyorum Bana bu şekilde çalıştım. –

0

Sanırım girişimin gerçekten çok yakın; ")" Katma sonra "/ * İletişim Veri * /})" ve:

Recipients = c.CampaignGroupsMappings.SelectMany(d => d.ContactGroup.ContactGroupMappings.Select(e => new ContactData() { /*Contact Data*/ })).Skip(c.TotalSent).Take(totalRequired).ToList() 

Not: Belki bir şey eksik, ama ben sadece Skip önce SelectMany() kapatmak gerek/al sonra ")" kaldırıldı ".Take (totalRequired) "