2012-07-03 70 views
0

以下LINQ to Entities查詢獲取來自電子郵件的所有鏈接點擊,並通過URL將它們分組並將其投影到模型中。在LINQ to SQL中對記錄進行分組和計數,同時包括來自計數的所有記錄

所需的最終結果會是這樣的:

Clicks | URL  | Clickers 
------------------------------------------------------------------------------------- 
2   x.com  User 1, User 2... 
1   y.com  User 1 

我有一個對象CampaignEmailRecipient其中包含誰點擊了鏈接,這也是我想在我的財產Clickers模型,包括所有用戶。

我只是不確定如何正確地與我的團隊做到這一點,並想知道是否有人能夠協助?

我的模型

public class CampaignEmailReportLinksViewModel 
{ 
    public int Id { get; set; } 
    public int CampaignElementId { get; set; } 
    public string LinkURL { get; set; } 
    public int QtyClicks { get; set; } 
    public CampaignEmailRecipient Clickers { get; set; } 
} 

我查詢

public List<CampaignEmailReportLinksViewModel> GetCampaignLinksByElementId(int id, int cid, string user) 
{ 
    var items = (from t1 in db.CampaignLinkClicks 
        where 
         (t1.CampaignLink.CampaignElementId == id) && 
         (t1.CampaignLink.CampaignElement.Campaign.CompanyId == cid) 

        group new {t1} by new 
             { 
              t1.CampaignLink.URL, 
              t1.CampaignLink.CampaignElementId 
             } 
        into g 

        select new CampaignEmailReportLinksViewModel 
          { 
           LinkURL = g.Key.URL, 
           QtyClicks = g.Count(), 
           Clickers = ??????????? 
          }).OrderByDescending(x => x.QtyClicks).ToList(); 

    return items.ToList(); 
} 

編輯

CampaignLinkClick看起來是這樣的:

public int Id 
public int CampaignRecipientId 
public string IP 
public datetime Timestamp 
public int CampaignLinkId 
+0

您可以列舉CampaignLinkClicks的所有屬性嗎? – Richthofen

+0

@Richthofen我已將此添加到問題的結尾。 – Nick

+0

謝謝。好吧,我假設CampaignRecipientId指向一個記錄,指出誰點擊了它?如果您使用EntityFramework和外鍵,則應該能夠使用CampaignLinkClick.CampaignRecipients上的導航屬性來獲取這些內容。如果你不使用外鍵,你必須做db.CampaignRecepients.Where(n => n.CampaignRecipientID = t1.CampaignLinkClick.CampaignRecipientID) – Richthofen

回答

1

如果你認爲你正在試圖做什麼,由你的URL的SQL將組項目,因此,如果您有:

User | URL  
-------------------------------------------------- 
User1   x.com  
User2   x.com  
User1   y.com 

當您通過URL組,你會得到一個結果中集等用戶的子元素將會丟失,像這樣,

URL  
-------------------------------------------------- 
x.com  
y.com  

一(相當昂貴)的辦法是讓每一個URL的結果,

select new CampaignEmailReportLinksViewModel 
          { 
           LinkURL = g.Key.URL, 
           QtyClicks = g.Count(), 
           Clickers = "" 
          } 

foreach(var item in items){ 
    item.Clickers = db.CampaignLinkClicks 
          .Where(x=>x.Url == item.URL) 
          .Clickers.Select(x=>x.Name).ToString(); 
} 
+0

感謝您的回覆。我想這正是我的問題:)我想知道如何以最簡潔的方式做到這一點。 – Nick