Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在第一个代码实体框架5中通过linq选择多对多关系中的数据_Linq_Entity Framework_Many To Many - Fatal编程技术网

如何在第一个代码实体框架5中通过linq选择多对多关系中的数据

如何在第一个代码实体框架5中通过linq选择多对多关系中的数据,linq,entity-framework,many-to-many,Linq,Entity Framework,Many To Many,我使用第一个代码实体框架5创建了一个数据库。在我的模型中,我的实体之间有一些多对多的关系。我不知道如何在这些模型中获取数据 我有这些课程 public abstract class BaseEntity { public int Id { get; set; } } public class UserGroupEntity : BaseEntity { public UserGroupEntity() { this.Users = new List<

我使用第一个代码实体框架5创建了一个数据库。在我的模型中,我的实体之间有一些多对多的关系。我不知道如何在这些模型中获取数据

我有这些课程

public abstract class BaseEntity
{
    public int Id { get; set; }
}

public class UserGroupEntity : BaseEntity
{
    public UserGroupEntity()
    {
        this.Users = new List<UserEntity>();
        this.Exams = new List<ExamEntity>();
    }

    public string Name { get; set; }
    public byte State { get; set; }

    public virtual IList<UserEntity> Users { get; set; }
    public virtual IList<ExamEntity> Exams { get; set; }
}

public class UserEntity : BaseEntity
{
    public UserEntity()
    {
        UserGroups = new List<UserGroupEntity>();
    }

    public string UserName { get; set; }
    public byte State { get; set; }

    public virtual IList<UserGroupEntity> UserGroups { get; set; }
}

public class ExamGroupEntity : BaseEntity
{
    public ExamGroupEntity()
    {
        this.Exams = new List<ExamEntity>();
    }

    public string Name { get; set; }
    public byte State { get; set; }

    public virtual IList<ExamEntity> Exams { get; set; }
}

public class ExamEntity : BaseEntity
{
    public ExamEntity()
    {
        this.UserGroups = new List<UserGroupEntity>();
        this.ExamDetail = new List<ExamDetailEntity>();
    }

    public string Name { get; set; }
    public byte State { get; set; }

    public virtual ExamGroupEntity ExamGroup { get; set; }
    public virtual IList<UserGroupEntity> UserGroups { get; set; }
}

在Linq中联接要求在查询的联接部分使用equals关键字而不是=符号,但随后要切换回C操作数,例如where子句中的==

遵循语法

从ListOfX中的x在x上的ListOfY中加入y。Id等于y。Id选择

var joined = 
(
from e in Exams join EJU in ExamsJoinUserGroups
on e.Id equals EJU.ExamId
join UJU in UsersJoinUserGroups
on EJU.UserGroupId equals UJU.UserGroupId 

where UJU.UserId == 2
&& e.ExamGroup_Id == 1
&& e.State == 1

select e
);

对于您的模型,LINQ查询可能如下所示:

var exams = context.ExamEntities
    .Where(e => e.UserGroups.Any(ug => ug.Users.Any(u => u.Id == 2)) &&
                e.ExamGroup.Id == 1 &&
                e.State == 1)
    .ToList();

在我的模型中,我没有任何与UsersJoinUserGroups相等的实体。您的意思是我必须创建一个像UsersJoinUserGroups这样的实体,并在第一个代码模型中创建关系表吗?啊,很抱歉——不过,在我看来,这是最接近底层数据逻辑的方法。拥有第三个联接表将是多对多关系的标准SQL实践
var joined = 
(
from e in Exams join EJU in ExamsJoinUserGroups
on e.Id equals EJU.ExamId
join UJU in UsersJoinUserGroups
on EJU.UserGroupId equals UJU.UserGroupId 

where UJU.UserId == 2
&& e.ExamGroup_Id == 1
&& e.State == 1

select e
);
var exams = context.ExamEntities
    .Where(e => e.UserGroups.Any(ug => ug.Users.Any(u => u.Id == 2)) &&
                e.ExamGroup.Id == 1 &&
                e.State == 1)
    .ToList();