c# - 如何使用 LINQ 查询将 SQL 连接与集合展平?
问题描述
假设我有两个表:Users 和 UserRoles:
Users:
+----+
| Id |
+----+
| 1 |
| 2 |
| 3 |
+----+
UserRoles:
+--------+----------+
| UserId | Name |
+--------+----------+
| 1 | A |
| 1 | B |
| 2 | A |
| 3 | C |
+--------+----------+
我需要能够将上述数据选择到如下所示的用户对象列表中:
class User
{
public int Id { get; set; }
public List<string> Roles { get; set; }
}
我能想到的最好的方法如下,但它最终会生成一个嵌套的 select 语句,我不知道这是否会影响性能:
List<Device> usersWithRoles = from user in Users
select new Device
{
Id = user.Id,
Roles = (from role in UserRoles where role.UserId == user.Id select role.Name).ToList()
}.ToList();
有没有更好(更高效)的方法来实现这一点?例如加入,我在想这样的事情,但不知道如何从加入中填充角色:
List<Device> usersWithRoles = from user in Users
join user_role in UserRoles on user.Id equals user_role.UserId
select new Device
{
Id = user.Id,
Roles = ??? // how do I populate this
}.ToList();
谢谢。
解决方案
使用GroupJoin
LINQ to SQL 方法:
List<Device> usersWithRoles = from user in Users
join user_role in UserRoles on user.Id equals user_role.UserId into roles
select new Device
{
Id = user.Id,
Roles = roles.ToList()
}.ToList();
推荐阅读
- flutter - 如何在复选框单击时显示 AlertDialog
- reactjs - 单击后未触发上下文菜单
- javascript - Chrome 扩展中 iFrame 的 Dom
- node.js - Express Validator,一种检查多种表格的功能
- reactjs - 如何在 ReactJS 中呈现存储为字符串的 jsx
- python - TypeError: POST 数据应该是字节
- r - 为什么 purrr 中的 map2() 不能始终如一地工作?
- javascript - 如何让函数调用自身 n 次
- .net - 字节[]字节=新字节[256];在 clr 中
- c++ - 从临时返回按值 string_view 时,有没有办法获得编译器警告?