使用实体框架从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,但我真的不知道它是如何工作的。
可能是这样的东西:
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集合,它将被访问、加入并为您解决所有问题。