2009-04-23 106 views
9

我一直使用.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語法呢?

回答

0

使用視圖來聚合來自多個表的結果,然後使用LINQ在視圖

+0

理想情況下,我一直在尋找一種只使用LINQ To SQL的解決方案,就像我在我的回答中提到的那樣,我可以直接從ADO.NET執行SQL查詢 - 但我想用LINQ To SQL與其他代碼保持一致感謝您的建議 – Martin 2009-04-23 13:12:21

+1

LINQ to SQL支持視圖,只需將它們拖放到設計器中,我知道您需要一個LINQ to SQL解決方案,我建議您創建一個視圖以供使用通過LINQ to SQL框架 – rguerreiro 2009-04-27 16:45:49

4

要模仿你提供你會做這樣的SQL查詢:

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

你是不是想頁超過廣告系列,收件人或兩者?

0

我認爲你的嘗試真的很接近;也許我失去了一些東西,但我認爲你只需要關閉之前跳過你的SelectMany()/送:

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

注:加「)」後,「/ *聯繫人數據* /})」和刪除「)」之後「。Take(totalRequired)「