使用 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#的主要内容,如果未能解决你的问题,请参考以下文章

Linq 按产品排序但显示类别

获取产品和类别的 ViewModel

MVC LINQ 查询以使用一对多和多对一表填充模型

Linq 不重复计数

Firebase 查询类别中的产品(数据库设置和最佳实践)

C#根据多个(26 + 3)类别以特定顺序对对象列表进行排序(LINQ,if else,switch case)[关闭]