我有3张桌子,他们之间有多对多的关系
用户:Id(PK),姓名
UserCourses:UserId(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 :(得分:2)
或多或少看起来对我好。如果只丢弃.AsEnumerable(),那不行吗?我认为你不需要那个。
我更熟悉LINQ扩展方法调用语法;我认为这样做的方式是
var courses = _entities.Users.Include("Courses")
.Where(a => a.Id == this.Id)
.SelectMany(a => a.Courses);
仅为课程名称添加.Select(c => c.Name)
。
答案 1 :(得分: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
与我的方式非常相似,所以最后一个版本可以安全地使用它。
答案 2 :(得分: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
答案 3 :(得分:0)
直接通过联接查询联结表:
var courses = (from uc in _entities.UserCourses
inner join c in _entities.Courses on uc.CourseId equals c.Id
inner join u in _entities.Users on uc.UserId equals u.Id
where uc.UserId equals u.Id
select c).ToList();