Возврат данных из 2 таблиц с Entity Framework - PullRequest
5 голосов
/ 02 апреля 2012

Я работаю с MVC3 и Entity Framework, но дошел до того, что мне нужно больше данных из разных таблиц. Обычно я делаю что-то подобное, чтобы получить данные из таблицы:

Table: Users
id
username

В коде я бы сделал что-то вроде этого, чтобы получить всех пользователей:

public static IEnumerable<Users> GetUsers( int userId )
{
    MyEntities ent = new MyEntities();

    return from g in ent.Users
           where g.OwnerUserId == userId
           select g;
}

Так что это вернет мне всех моих пользователей.


Но пользователь может присоединиться к группе, и я должен получить все имена пользователей из определенной группы.

Table: userGroups
id
fk_user_id
fk_group_id

Теперь, если бы я использовал этот код:

public static IEnumerable<userGroups> GetUsersFromGroup( int groupId )
{
    MyEntities ent = new MyEntities();

    return from g in ent.userGroups
           where g.OwnerUserId == userId
           select g;
}

Теперь, очевидно, это только возвращает мне данные из таблицы "userGroups". Но почему-то мне также нужно имя пользователя из таблицы Users. Как я могу получить эти данные и при этом вернуть мои «группы пользователей» в виде IEnumerable?

В SQL я просто сделал бы левое соединение, но я не могу понять, как это работает здесь.

Ответы [ 3 ]

5 голосов
/ 02 апреля 2012

Нечто подобное может быть:

var query = from g in ent.userGroups
            join u in ent.Users on g.fk_user_id equals u.userID
            select new { g, u, });

или с LEFT JOIN

var query = (from g in ent.userGroups
             from u in ent.Users.Where(a => a.fk_user_id == u.userID).DefaultIfEmpty()
             select new { g, u, });
3 голосов
/ 02 апреля 2012
var query = from ug in ent.userGroups
            join u in ent.Users on ug.OwnerUserId = ug.userID
            select new
            {
                Name = u.UserName,
                Id = u.userID
                Group = ug.GroupName
            };

Если вам нужно покинуть соединение, вам потребуется DefaultIfEmpty.

Пожалуйста, проверьте следующие статьи:

2 голосов
/ 02 апреля 2012

Приведенные выше запросы потребуют от вас изменить сигнатуру вашего метода, что может быть очень трудоемкой работой, в зависимости от того, где вы ее настроили. В частности, Arion в значительной степени полностью имитирует поведение левого соединения, о котором вы говорите (это здорово, потому что вы знаете, что делает Entity), но вам нужно будет изменить тип возвращаемого значения на Tuple<userGroups, Users> или что-то в этом роде.

Вместо этого вы можете обновить poco userGroups, добавив свойство nav в таблицу Users. Если я правильно понимаю ваш заданный вопрос, у вас есть отношения один ко многим, которые существуют здесь. В этом случае вы бы изменили poco следующим образом:

public class userGroups
{
    public int ID { get; set; }
    public string GroupName { get; set; }
    public virtual ICollection<Users> Users { get; set; }
}

public class Users
{   
    public int ID { get; set; }        
    public string Name { get; set; }
    public virtual userGroups UserGroup { get; set; }
}

Однако имена, которые вы разместили в исходном вопросе, не соответствуют тому, что Entity считает нормализованным именованием, поэтому вам может понадобиться использовать аннотации данных, как описано здесь . Ctrl-F "ForeignKey", если у вас возникли проблемы с его поиском, это своего рода большой информационный дамп для аннотаций данных в целом.

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

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