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 ileselect * 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?
İ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
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