2011-01-19 123 views
1

我有一个多3个表,他们之间有很多关系EF和LINQ - 多对多的关系

用户:ID(PK),名称

UserCourses:用户ID(PK),CourseId(PK)

课程:ID(PK),名称

我需要写一个LINQ查询,选择用户X的所有课程名称,并在返回的IEnumerable,但我无法得到它的工作。

编辑:

public IEnumerable<Courses> GetCourses 
     { 
      get 
      { 
       return (from a in _entities.Users.Include("Courses") 
         where a.Id == this.Id 
         select a.Courses.AsEnumerable() 
         ); 
      } 
     } 

任何帮助非常赞赏

感谢

+0

我刚添加了代码 – user441365 2011-01-19 14:20:46

+0

当你运行这个时发生了什么?你收到错误的数据了吗?抛出异常? – 2011-01-19 14:49:20

+0

错误31无法将类型'System.Linq.IQueryable >'隐式转换为'System.Collections.Generic.IEnumerable '。存在明确的转换(您是否缺少演员?) – user441365 2011-01-19 15:11:23

回答

2

对于发生了什么问题你有点不清楚,但看起来它会产生一个IEnumerable<IEnumerable<Courses>>类型。如果你正在寻找一个扁平IEnumerable<Courses>,我认为你是,你需要的东西,如:

public IEnumerable<Courses> GetCourses 
    { 
     get 
     { 
      var query = from a in _entities.Users.Include("Courses") 
         where a.Id == this.Id 
         select a; 

      return query.FirstOrDefault().Courses; 
     } 
    } 

编辑:为了避免一个NullReferenceException,试试这个来代替:

public IEnumerable<Courses> GetCourses 
    { 
     get 
     { 
      var query = from a in _entities.Users.Include("Courses") 
         where a.Id == this.Id 
         select a.Courses; //note the difference 

      return query.SelectMany(i => i); 
     } 
    } 

请注意,有多种方法可以做到这一点;例如,你也可以使用:

  var query = from a in _entities.Users.Include("Courses") 
         where a.Id == this.Id 
         select a; 

      var user = query.FirstOrDefault(); 

      return user == null 
         ? user.Courses 
         : null; 

如果SelectMany版本还是引起了一个NullReferenceException,使用这个来代替。我不认为它应该,但我没有测试它。你表示Rup的解决方案已经完成了,他使用SelectMany的方式与我很相似,因此最后一个版本可以安全使用。

0

试一下

from b in _entities.Users.Include("UserCourses") on a.UserID equals this.ID 
join c in _entities.Users.Include("Courses") on b.CourseID equals c.ID 
select c.name 
2

或多或少看起来不错给我。如果你只是放弃.AsEnumerable(),那么这不起作用吗?我不认为你需要这个。

我更喜欢LINQ扩展方法调用语法;我想办法只是课程名称做那样是在

var courses = _entities.Users.Include("Courses") 
         .Where(a => a.Id == this.Id) 
         .SelectMany(a => a.Courses); 

一个额外.Select(c => c.Name)