SQL-запрос «многие ко многим» в EntityFramework - PullRequest
2 голосов
/ 18 декабря 2010

Мне нужна помощь по SQL-запросу, для которого я использую EntityFramework в качестве ORM.

У меня есть отношение «пользователь - группа« многие ко многим »», т. Е. Один пользователь может принадлежать к нескольким группам, а одна группа может иметь более 1 пользователя.

То, как я сделал отображение, это ..

USER tbl, таблица Usr_Grp и таблица групп, где PK = первичный ключ, FK = внешний ключ

Таблица USER имеет -> UserId (PK), UserName
Групповая таблица имеет -> GroupId (PK), GroupName
Таблица Usr_Grp имеет -> Id (PK), UUserId (от FK до пользователя), GGroupId (от FK до GroupTable)

Проблема, с которой я сталкиваюсь ... В моем API я получу набор GroupId, и я хочу найти только тех пользователей, которые принадлежат всем этим GroupId (то есть всем группам, которые передаются в ).

Есть ли способ написать этот запрос в Entity Framework или Sql. Я был бы очень признателен за любую помощь, которую я могу получить в этом.

-rN

Ответы [ 3 ]

6 голосов
/ 18 декабря 2010

Соединительная таблица Usr_Grp не должна иметь Id. Если вы создадите сложный первичный ключ поверх (UUserId, GGroupId), то EF автоматически поймет, что это отношение «многие ко многим».

Если вы делаете ваши отношения следующим образом: alt text

Тогда EF будет генерировать сущности с отношениями «многие ко многим»: alt text

После того, как все настроено, вы можете легко использовать такой код:

var ids = new List<int>{1, 2, 3, 4}; // GroupIds you need
context.Groups
        .Where(x=> ids.Contains(x.Id))
        .SelectMany(x=>x.Users)
        .Distinct()
        .ToArray();

Если вы не можете изменить модель, просто используйте такой запрос linq:

context.Grp_Usrs
        .Where(x=> ids.Contains(x.GroupId))
        .SelectMany(x=>x.Users)
        .Distinct()
        .ToArray();
0 голосов
/ 18 декабря 2010
    //Here is a LinqToSql example but it should work with EF too.Taking into consideration your mappings I would have the following approach in handling a many to many relationship:

    //1. First You need to save you records into the tables as many to many relationship
    [Test]
    public void CanSaveGroupUsers()
    {
        var group = Group { CreatedDate = DateTime.UtcNow, Name = "The Rookies" };
        var groupId = _groupRepository.SaveGroup(group);

        var user = new User { CreatedDate = DateTime.Now, Name = "Justin Bieber" };
        var userId = _userRepository.SaveUser(user);

        var userGroup = new UserGroup { GroupId = groupId, UserId = userId };
        _group.SaveUserGroup(userGroup);
    }

    //2. Then you can retrive them this way:
    [Test]
    public void CanGetGroupUsers()
    {
        var groupIds = new List<int>{1,2,3,4};
        var users = _usersRepository.GetAllUsers();
        var specificUsersList = (users.AsQueryable().Where(user => groupIds.Contains(user.UserGroups.FirstOrDefault().GroupId)));
    }

    //3. I attached my repository code just in case
    public IQueryable<User> GetAllUsers()
    {
        _db.ObjectTrackingEnabled = false;
        return _db.Users;
    }
    public int SaveGroup(Group Group)
    {
        var dbGroup = new Group
        {
            Name = Group.Name,
            CreatedDate = Group.CreatedDate
        };
        _db.Groups.InsertOnSubmit(dbGroup);
        _db.SubmitChanges();
        return dbGroup.Id;
    }

    public int SavUser(User user)
    {
        var dbUser = new User
        {
            CreatedDate = user.CreatedDate,
            Name = user.Name
        };
        _db.Users.InsertOnSubmit(dbUser);
        _db.SubmitChanges();
        return dbUser.UserId;
    }

     public void SaveUserGroup(UserGroup userGroup)
    {
        var dbUserGroup = new UserGroup
        {
            GroupId = userGroup.GroupId,
            UserId = userGroup.UserId

        };
        _db.UserGroups.InsertOnSubmit(dbUserGroup);
        _db.SubmitChanges();
    }

    //Hope this helps:)
0 голосов
/ 18 декабря 2010

Попробуйте этот метод:

var gid = new List<int> {1, 2, 3, 4};
var users_id = entity.Usr_Grp.where(x=> gid.Contains(x.uid);

Надеюсь, это поможет!

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