构建实体加入LINQ查询

时间:2015-02-11 21:20:53

标签: mysql asp.net linq linq-to-entities entity-framework-6

我有下表strutucture并使用MySQL Entity Framework访问它们:

Table Users
- Id
- Name

Table Subscriptions
- Id
- Id_User
- Id_Course

Table Courses
- Id
- Name

我想要并且很难做到的是为所有用户构建链接查询,返回包含以下内容的每个条目的列表:

  • 用户ID;
  • 用户名;
  • 用逗号分隔的Concat字符串与用户的所有课程或“没有课程”#39;字符串,如果没有。

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

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

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, ???}  

有人可以帮我吗?

1 个答案:

答案 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之后。

但是,首先进行投影(第一部分)可能仍然有效,否则可能会从数据库中提取太多数据。