EF& linq - 多对多关系

时间:2011-01-19 14:06:37

标签: .net linq entity-framework

我有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()
                        );
            }
        }

任何帮助非常感谢

由于

4 个答案:

答案 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();