【问题标题】:Building an entity join LINQ query构建实体连接 LINQ 查询
【发布时间】:2015-04-12 10:30:02
【问题描述】:

我有以下表格结构,并正在使用 MySQL Entity Framework 访问它们:

Table Users
- Id
- Name

Table Subscriptions
- Id
- Id_User
- Id_Course

Table Courses
- Id
- Name

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

  • 用户 ID;
  • 用户名;
  • Concat 字符串以逗号分隔,包含用户的所有课程,如果没有,则为“无课程”字符串。

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

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

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

谁能帮帮我?

【问题讨论】:

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


    【解决方案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之后)。

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

    【讨论】:

    • 太棒了,我有一个导航,你的代码运行良好。实体是如此聪明,以至于有时我看不出它有多简单。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-31
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多