使用实体框架从2个表中返回数据

本文关键字:返回 数据 2个 实体 框架 | 更新日期: 2023-09-27 18:29:48

我正在使用MVC3和实体框架,但我需要来自不同表的更多数据。通常我会做这样的事情来从表中获取数据:

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表中的用户名。我如何也能获得这些数据,并且仍然将我的"userGroups"作为IEnumerable返回?

在SQL中,我只想做一个LEFT JOIN,但我真的不知道它是如何工作的。

使用实体框架从2个表中返回数据

可能是这样的东西:

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, });
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。

请查看以下文章:

  • http://codingsense.wordpress.com/2009/03/08/left-join-right-join-using-linq
  • http://www.dotnetperls.com/join

上面的查询将要求您更改方法签名,这可能是一项非常痛苦的工作,具体取决于您在哪里进行了设置。特别是Arion,它几乎完全模仿了您所说的左联接行为(这很好,因为您知道Entity在做什么),但您需要将返回类型更改为Tuple<userGroups, Users>或类似性质的类型。

您可以尝试更新userGroups-poco,以便在Users表中包含nav属性。如果我能正确理解你发布的问题,那么你在这里存在一对多的关系。在这种情况下,您可以按如下方式更改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"如果您在查找它时遇到一些困难,那么它是一个关于数据注释的大信息转储。

好处是,如果你这样链接,你就再也不用担心加入了。您可以简单地访问userGroups上的Users集合,它将被访问、加入并为您解决所有问题。