使用 linq 查询最流行的类别 C#
Posted
技术标签:
【中文标题】使用 linq 查询最流行的类别 C#【英文标题】:Using linq to query the most popular categories C# 【发布时间】:2021-09-13 21:54:02 【问题描述】:我正在尝试使用 .net core3.0 中的 linq 查询筛选所有订单以找到最受欢迎的类别。
虽然类别表有 2 个连接深度,但更难。下面是我的表架构的描述。
Order -> Topic -> Category
------------- ------------ ------------
Id Id Id
TopicId CategoryId Name
有没有办法通过查询订单表来计算哪些类别最受欢迎?以下是一些示例数据:
Order Topic Category
------------- --------------- --------------
Id TopicId Id CategoryId Id Name
1 10 1 2 1 Food
2 10 2 2 2 Tech
3 3 3 3 3 Health
4 5 5 4 4 Automotive
7 10 ... 5 Geography
8 10 8 8 6 Sports
9 8 9 8 7 Teaching
10 8 8 Programming
因此基于此我希望看到类似于以下的结果:
[
CategoryId: 8, //Programming
Count: 5
,
CategoryId: 3, //Health
Count: 1
,
CategoryId: 4, // Automotive
Count: 1
]
以下是我的 c# 模型
[Table("Order")]
public class Order
[Key, Required]
public int Id get; set;
[ForeignKey(nameof(Topic))]
public int TopicId get; set;
#region Foreign key mappings
public virtual Topic Topic get; set;
#endregion
[Table("Topic")]
public class Topic
[Key, Required]
public int Id get; set;
[Required, ForeignKey(nameof(Category))]
public int CategoryId get; set;
#region Foreign key mappings
public virtual Category Category get; set;
#endregion
[Table("Category")]
public class Category
public Category()
this.Topics = new HashSet<Topic>();
[Key, Required]
public int Id get; set;
[Required, MaxLength(74)]
public string Name get; set;
#region Foreign key mappings
public virtual ICollection<Topic> Topics get; set;
#endregion
【问题讨论】:
向我们展示一些示例表数据和预期结果 - 全部为格式化文本(不是图像)。minimal reproducible example 至少要加载订单的Topic关系才能得到Category ID。然后你可以为分类做统计。如果您还想显示类别的名称和其他属性,则还必须加载它们。但是只需加载每个类别实体一次就足够了,而不是像 Order-and-Topic 的“深度”连接。 @jarlh 问题已更新 请向我们提供您的类映射实体,以便我们了解事物在实体框架中的映射方式 @Andre.Santarosa 我已将实体框架模型添加到问题中 【参考方案1】:要实现此输出,您可以使用此查询。
当您创建联接时,LINQ 会自动匹配条目并更容易获得最终结果
var popularCategories = (from a in categories
join b in topics on a.Id equals b.CategoryId
join c in orders on b.Id equals c.TopicId
select a).GroupBy(x => x.Name)
.Select(x => new
CategoryId = x.FirstOrDefault().Id,
Count = x.Count()
).OrderByDescending(x => x.Count).ToList();
【讨论】:
在 GroupBy() 之前添加了“.ToList()”,这解决了我的问题。谢谢先生。以上是关于使用 linq 查询最流行的类别 C#的主要内容,如果未能解决你的问题,请参考以下文章
C#根据多个(26 + 3)类别以特定顺序对对象列表进行排序(LINQ,if else,switch case)[关闭]