首页 > 解决方案 > 对实体的 LINQ 查询,按类别返回项目

问题描述

我正在使用实体框架核心。我有以下实体:

public class Category {
    public long Id { get; set; }
    public string Name { get; set; }
}

public class Product {
    public long Id { get; set; }
    public long CategoryId { get; set; }
    public string Name { get; set; }
}

我想要一个分组,其中我的键是我的类别,并且我有一个产品列表。我想对数据库运行单个查询来执行此操作。

var data = context.Categories
            .Join(
                Products,
                c => c.Id,
                p => p.CategoryId,
                (c, p) => new {
                   Category = c,
                   Product = p
               }
            )
            .ToList();

这会运行我想要的查询,并且似乎生成了一个带有匿名对象的列表,该对象具有类别和产品。如果我然后执行以下操作,它会做我想要的:

var grouped = data.GroupBy(x => new { x.Category });

键很好,但值列表似乎重复了类别。有没有办法做到这一点,所以我有一个 Key 是 Category 然后值是 Product 对象的列表?更喜欢方法语法,但在这一点上,如果有人能得到我,我希望能弄清楚查询语法。

标签: c#.netlinq

解决方案


正确的解决方案是这样的:

var result = (from p in context.Products
              join c in context.Categories
                  on p.CategoryId equals c.Id
              select new
              {
                  Product = p,
                  Category = c
              })
              .ToList() // because still grouping object is not supported in EF Core we have to materialize first and then do our grouping
              .GroupBy(g => g.Category, g => g.Product)
              .ToDictionary(p => p.Key, p => p.ToList());

推荐阅读