2011-09-17 55 views
2

多对一对多关系使用实体框架4.1代码第一次我有两个对象有许多一对多的关系:计数在实体框架

public class Article 
    { 
     public int ID { get; set; } 
     public string Title { get; set; } 
     public string Description { get; set; } 
     public ICollection<Tag> Tags { get; set; } 
} 

public class Tag 
     { 
      [Key] 
      public string UrlSlug { get; set; } 
      public string Name { get; set; } 
      public ICollection<Article> Articles { get; set; } 
} 

我想算应用中最常见的标签到文章。我如何在LINQ中做到这一点?

我尝试下面的代码只下令标签:

var tagsFromDb = db.Tags 
        .GroupBy(q => q.UrlSlug) 
        .OrderByDescending(gp => gp.Count()) 
        .Select(g => g.FirstOrDefault()); 

回答

3

如果我理解正确的,你有文章和标签,但标签上侧的导航属性之间的许多一对多的关系,不会暴露(Tag中没有ICollection<Article>)。我认为,在这种情况下,你必须从文章开始让所有使用的标签与信息他们是如何经常在文章中使用沿着:

var tagQuery = db.Articles 
    .SelectMany(a => a.Tags)   // flat enumeration of all used tags 
    .GroupBy(t => t, (k, g) => new // k = key = Tag, g = group of same tags 
    { 
     Tag = k,      // the tag 
     Count = g.Count()    // how often does it occur in the articles 
    }) 
    .OrderByDescending(g => g.Count); // most used tags first 

如果你想所有标签降序排序,请拨打

var tagList = tagQuery.ToList(); 

如果你只是想这是最经常在文章中使用的标签,请拨打

var mostUsedTag = tagQuery.FirstOrDefault(); 

在这两种情况下,结果是它具有匿名类型的集合/单个对象TagCount作为成员。如果您只是想要标签并且不再对Count感兴趣,则可以在申请ToListFirstOrDefaulttagQuery.Select(anonymous => anonymous.Tag)....之前进行投影。

编辑

刚才看到你的问题的编辑。现在,当您在Tag实体中有Article集合时,它更容易:

var tagQuery = db.Tags 
    .Select(t => new 
    { 
     Tag = t,      // the Tag 
     Count = t.Articles.Count() // just count the number of artices 
             // the tag is used in 
    }) 
    .OrderByDescending(x => x.Count); // most used tags first