EF & linq - отношения многие ко многим - PullRequest
1 голос
/ 19 января 2011

У меня есть 3 таблицы, между которыми есть отношения многие ко многим

Пользователь: Id (PK), Имя

UserCourses: UserId (PK), CourseId (PK)

Курсы: Id (PK), Имя

Мне нужно написать запрос linq, чтобы выбрать все имена курсов пользователя X и вернуться в IEnumerable, но я не могу заставить его работать.

EDIT:

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

Любая помощь высоко ценится

Спасибо

Ответы [ 4 ]

2 голосов
/ 19 января 2011

Это более или менее выглядит нормально для меня.Разве это не работает, если вы просто отбросите .AsEnumerable ()?Я не думаю, что вам это нужно.

Мне больше нравится синтаксис вызова метода расширения LINQ;Я думаю, что сделать это можно так:

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

с дополнительным .Select(c => c.Name) только для названий курсов.

2 голосов
/ 19 января 2011

Вам немного неясно, что идет не так, но похоже, что это приведет к типу 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, используйте его вместо этого. Я не думаю, что это должно, но я не проверял это. Вы указали, что решение Рупа сделало это, и он использует SelectMany почти так же, как и я, поэтому эта последняя версия оберегает его.

0 голосов
/ 18 января 2019

Запросите соединительную таблицу напрямую с помощью объединений:

            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();
0 голосов
/ 19 января 2011

Попробуйте это

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...