2012-07-03 39 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