如何使用实体框架c#在表中显示带有外键的三个表的值?

时间:2018-12-07 11:11:21

标签: c# entity-framework

您好,我是实体和asp.net M.V.C的新手,我正在使用实体框架代码优先处理已建立的数据库的方法,我想使用内部联接在一个表中显示三个表数据,并感到困惑

我尝试了下面给出的以下代码

 public List<NewGroupRoles> GetAllGroups()
    {

        try
        {
            using(var p=new VMSDBContext())
            {
                var group = (from group_role in p.group_roles
                             join groups in p.groups on group_role.group_id equals groups.group_id
                             join roles in p.roles on group_role.roles_id equals roles.role_id
                             select new
                             {
                                 Id = group_role.group_roles_id,
                                 group_name = groups.group_name,
                                 group_role = roles.role_name
                             }).ToList();


            }

        }
        catch(Exception ex)
        {
            return new List<NewGroupRoles>();
        }
    }

我想从模型中的函数返回它

模型类是ths class defines all the database entity classes

this a group table

[这是组角色类][3]

role class

2 个答案:

答案 0 :(得分:0)

您正在尝试做EF应该为您做的工作。

看起来groupsroles表之间有多对多关系。为什么不删除group_roles类,仅定义导航属性

public virtual IEnumerable<roles> roles { get; set; }

groups模型类中和

public virtual IEnumerable<groups> groups { get; set; }

roles模型类中

并以某种方式获取组和角色的列表:

var groupRoles = p.groups.SelectMany(g=>g.roles, (g,r)=>new {Group = g.group_name, Role = r.role_name}).ToList();

或者,如果您使用的是EF Core,而该EF Core在没有中间模型类的情况下仍不支持多对多关系,或者仅坚持在模型中包含中间类group_roles,则可以在其中定义两个导航属性,就像这样:

public class group_roles
{
    [Key]
    public int group_roles_id { get; set; }

    [ForeignKey("groups")]
    public int group_id { get; set; }

    [ForeignKey("roles")]
    public int role_id { get; set; }

    public virtual groups group { get; set; }
    public virtual roles role { get; set; }
}

那么您的查询就是

var groupRoles = p.group_roles.Select(gr=> new {gr.group_roles_id, Group=gr.group.group_name, Role=gr.role.role_name).ToList();

答案 1 :(得分:-2)

在选择时需要新对象时使用它

public List<NewGroupRoles> GetAllGroups()
            {

                try
                {
                    using(var p=new VMSDBContext())
                    {
                        var group = (from group_role in p.group_roles
                                     join groups in p.groups on group_role.group_id equals groups.group_id
                                     join roles in p.roles on group_role.roles_id equals roles.role_id
                                     select new NewGroupRoles()
                                     {
                                         Id = group_role.group_roles_id,
                                         group_name = groups.group_name,
                                         group_role = roles.role_name
                                     }).ToList();


                    }

                }
                catch(Exception ex)
                {
                    return new List<NewGroupRoles>();
                }
       return group;
}