构建实体连接 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 一个列表,每个条目包含:

此列表应按用户名的一部分进行过滤。

我已经开始构建代码但无法完成:

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 之后)。

但是先做一个投影(第一部分)可能还是有效率的,否则可能会从数据库中获取太多数据。