gpt4 book ai didi

linq - 在 Entity Framework 中计算多对多关系

转载 作者:行者123 更新时间:2023-12-04 06:14:17 25 4
gpt4 key购买 nike

使用 Entity Framework 4.1 Code First 我有两个具有多对多关系的对象:

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

最佳答案

如果我理解正确的话,文章和标签之间存在多对多关系,但标签端的导航属性没有暴露(在 ICollection<Article> 中没有 Tag)。我认为在这种情况下,您必须从文章开始获取所有使用过的标签以及它们在文章中的使用频率:

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

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

编辑

刚刚在您的问题中看到了编辑。现在,当您拥有 Article收藏在 Tag实体更容易:
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

关于linq - 在 Entity Framework 中计算多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7454035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com