c# - 对实体的 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 对象的列表?更喜欢方法语法,但在这一点上,如果有人能得到我,我希望能弄清楚查询语法。
解决方案
正确的解决方案是这样的:
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());
推荐阅读
- asp.net - 有时在 /signin-oidc 上出现 404
- c# - 使用 foreach asp.net mvc 5 避免重复
- typescript - 在打字稿nodejs应用程序中导入变量时无法解析本地模块
- events - Outlook 插件:删除日历事件
- java - 在 Jackson 中传递 null 时使用字段的默认值
- html - 从 :hover 元素移动锚点后隐藏列表
- kotlin - 我应该在声明、初始化块、构造函数还是后期初始化时初始化变量?
- node.js - NodeJS 和 Excel 中的登录系统
- android - 如何在Android Studio的数据绑定中将值传递给android.view.View.OnClickListener的变量?
- c++ - 克隆一个链表,其中每个节点都有一个指向链表中任何其他节点的随机指针