构建实体连接 LINQ 查询
Building an entity join LINQ query
我有以下 table 结构,我正在使用 MySQL Entity Framework:
访问它们
Table Users
- Id
- Name
Table Subscriptions
- Id
- Id_User
- Id_Course
Table Courses
- Id
- Name
我想要但很难做到的是为所有用户构建一个 link 查询,returns 一个列表,每个条目包含:
- 用户 ID;
- 用户名;
- 用逗号分隔的 Concat 字符串与用户的所有课程或 'no courses' 字符串,如果 none。
此列表应按用户名的一部分进行过滤。
我已经开始构建代码但无法完成:
var Model db = new Model();
var list = from user in db.Users
join ???
where user.Name.Contains(filter.Trim())
select new { Name = user.Name, Id = user.Id, ???}
有人可以帮我吗?
您应该为此使用导航属性(如 User.Subscriptions
)。根据您创建模型的方式,它们可能已经存在,否则您应该首先添加它们。
var query = from u in db.Users
where user.Name.Contains(filter) // trim the filter value first
select new
{
u.Name,
u.Id,
Courses = u.Subscriptions.Select(s => s.Course.Name)
};
var result = query.AsEnumerable()
.Select(q => new
{
q.Name,
q.Id
Courses = string.Join(", ", q.Courses)
};
分两个阶段执行此操作的原因是 string.Join
不能直接用于 EF LINQ 表达式(不能转换为 SQL),因此必须在内存(即在 AsEnumerable
之后)。
但是先做一个投影(第一部分)可能还是有效率的,否则可能会从数据库中获取太多数据。
我有以下 table 结构,我正在使用 MySQL Entity Framework:
访问它们Table Users
- Id
- Name
Table Subscriptions
- Id
- Id_User
- Id_Course
Table Courses
- Id
- Name
我想要但很难做到的是为所有用户构建一个 link 查询,returns 一个列表,每个条目包含:
- 用户 ID;
- 用户名;
- 用逗号分隔的 Concat 字符串与用户的所有课程或 'no courses' 字符串,如果 none。
此列表应按用户名的一部分进行过滤。
我已经开始构建代码但无法完成:
var Model db = new Model();
var list = from user in db.Users
join ???
where user.Name.Contains(filter.Trim())
select new { Name = user.Name, Id = user.Id, ???}
有人可以帮我吗?
您应该为此使用导航属性(如 User.Subscriptions
)。根据您创建模型的方式,它们可能已经存在,否则您应该首先添加它们。
var query = from u in db.Users
where user.Name.Contains(filter) // trim the filter value first
select new
{
u.Name,
u.Id,
Courses = u.Subscriptions.Select(s => s.Course.Name)
};
var result = query.AsEnumerable()
.Select(q => new
{
q.Name,
q.Id
Courses = string.Join(", ", q.Courses)
};
分两个阶段执行此操作的原因是 string.Join
不能直接用于 EF LINQ 表达式(不能转换为 SQL),因此必须在内存(即在 AsEnumerable
之后)。
但是先做一个投影(第一部分)可能还是有效率的,否则可能会从数据库中获取太多数据。