Как правильно считать сущности - PullRequest
1 голос
/ 17 июля 2011

У меня есть метод с атрибутом «пользователь», и я пытаюсь проверить, находится ли он уже в команде данного «курса»

        private static bool UserIsInTeamOfCourse(Course course, User user)
        {
            var count = course.Teams.Count(x => x.Users.Contains(user));
            if (count > 0)
            {
                return true;
            }

            return false;
        }

Но это не работает. Я сделал собственный метод Equals в своей модели User, но он все еще не работает. [РЕДАКТИРОВАТЬ] Всегда учитывает ноль записей, но должна быть хотя бы одна запись.

    public override bool Equals(object obj)
    {
        return UserId == ((User)obj).UserId;

    }

Ответы [ 3 ]

1 голос
/ 17 июля 2011
bool isUserInAnyTeam = course.Teams.Any(t => t.Users.Any(u => u.Id == user.Id));

Это LINQ to Objects, потому что вы запрашиваете коллекцию Teams в памяти. Таким образом, предполагается, что коллекция Teams уже загружена или будет загружена лениво. Если он не загружен и вы не используете отложенную загрузку, вы можете создать запрос к базе данных для коллекции:

В EF 4.1 с DbContext:

bool isUserInAnyTeam = dbContext.Entry(course).Collection(c => c.Teams).Query()
                                .Any(t => t.Users.Any(u => u.Id == user.Id));

Или в EF 4.0:

bool isUserInAnyTeam = course.Teams.CreateSourceQuery()    
                             .Any(t => t.Users.Any(u => u.Id == user.Id));

Teams должен иметь тип EntityCollection<Team> в последнем случае.

Другой способ - запрос с нуля:

bool isUserInAnyTeamOfCourse = context.Courses.Any(
  c => c.Id == course.Id && c.Teams.Any(t => t.Users.Any(u => u.Id == user.Id)));
0 голосов
/ 17 июля 2011

Вместо сравнения пользовательских объектов сравнивайте userID (который, вероятно, int или другой простой тип)

    private static bool UserIsInTeamOfCourse(Course course, User user)
    {
        return course.Teams.Where(team => team.Users.Any(u => u.userID == user.userID)).Count() > 0;
    }
0 голосов
/ 17 июля 2011

Предполагая, что между командами и пользователями существует много-много отношений, и пользователь не будет дважды входить в одну и ту же команду.

var count = (from c in context.Teams
            from u in c.Users
            where u.Id == 1
            select c.Id).Count();

Entity Framework не может перевести ваш код на c #, в который выпереопределение равно функции sql.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...