我有下表strutucture并使用MySQL Entity Framework访问它们:
Table Users
- Id
- Name
Table Subscriptions
- Id
- Id_User
- Id_Course
Table Courses
- Id
- Name
我想要并且很难做到的是为所有用户构建链接查询,返回包含以下内容的每个条目的列表:
此列表应按用户名的一部分进行过滤。
我已经开始构建代码但无法完成代码:
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, ???}
有人可以帮我吗?
答案 0 :(得分:1)
您应该使用导航属性(例如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
之后。
但是,首先进行投影(第一部分)可能仍然有效,否则可能会从数据库中提取太多数据。