我一直使用.Skip()和.Take()擴展方法與LINQ To SQL一段時間沒有問題,但在所有使用它們的情況下,它一直是單個表 - 如:LINQ to SQL Paging
database.Users.Select(c => c).Skip(10).Take(10);
我的問題是,我現在突出的一組來自多個表的結果,我想頁面上的總集(和仍然得到分頁的利益在DB) 。
我的實體模型看起來是這樣的:
的促銷活動中有許多]組,
這是通過在數據庫中像
的關係建模組[有許多]接觸Campaign - > CampaignToGroupMapping - > Group - > GroupToContactMapping - > Contact
我需要生成一個數據結構ho lding
Campaign
CampaignName
CampaignFrom
CampaignDate
Recipients
Recipient 1
Recipient 2
Recipient n...
我曾試圖用.SelectMany項目從每個組的組觸點到寫一個LINQ查詢活動的細節,還通過CampaignToGroupMapping與廣告系列中的每個聯繫人的列表,即一個線性數據集,希望我能夠.Skip()。從中獲取()。
我的嘗試是:
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();
的問題是,尋呼(至於跳過()和Take())正在發生的事情爲一組,而不是整個數據集。
這意味着,如果我使用的值200爲參數totalRequired(傳遞給。取()),我有與該活動相關聯的3個基團,這將需要200從每個組 - 200不從總數據來自與該活動相關聯的每個組。
在SQL中,我可以查詢實現這一目標,例如:
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
有了這個查詢,我在分頁組合集中來自與特定活動相關聯的每個聯繫人組。所以我的問題是,我怎樣才能實現這個使用LINQ to SQL語法呢?
理想情況下,我一直在尋找一種只使用LINQ To SQL的解決方案,就像我在我的回答中提到的那樣,我可以直接從ADO.NET執行SQL查詢 - 但我想用LINQ To SQL與其他代碼保持一致感謝您的建議 – Martin 2009-04-23 13:12:21
LINQ to SQL支持視圖,只需將它們拖放到設計器中,我知道您需要一個LINQ to SQL解決方案,我建議您創建一個視圖以供使用通過LINQ to SQL框架 – rguerreiro 2009-04-27 16:45:49