Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.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
C# 查询多对多关系EntityFramework(做错了??)_C#_Entity Framework_Many To Many_Code First - Fatal编程技术网

C# 查询多对多关系EntityFramework(做错了??)

C# 查询多对多关系EntityFramework(做错了??),c#,entity-framework,many-to-many,code-first,C#,Entity Framework,Many To Many,Code First,我一直在做一些关于这个主题的研究,并在我的项目中找到了实现这个查询的方法,但我不确定这里是否有问题。请帮忙 总之,我创建了如下实体: class Student { public int StudentId { get; set; } public string Name { get; set; } public ICollection<Courses> Courses {get;set;} //or public List <Courses> {get;set;}

我一直在做一些关于这个主题的研究,并在我的项目中找到了实现这个查询的方法,但我不确定这里是否有问题。请帮忙

总之,我创建了如下实体:

 class Student
{
public int StudentId { get; set; }
public string Name { get; set; }

public ICollection<Courses> Courses {get;set;} //or public List <Courses> {get;set;}
}

class Course
{
public int CourseId { get; set; }
public string Name { get; set; }

public ICollection<Students> Students {get;set;} //or public List<Students> {get;set;}
}





// We can see here that the database creates the Join Table Correctly
我们看一下列表,courses集合的值为空。这里发生了什么?EF不应该映射它并查询SQL以获取信息吗

在这之后,y无法解决问题,因为我发现的信息使用了框架的其他方法(我认为是图表优先),他们在实体图中设置了一些东西



我是如何解决这个问题的:

在Wordpress帖子中找到一个我没有尝试过的查询,并添加一些其他代码来实现我想要的:

aux_S = contexto.Students.ToList();




 foreach(var element in aux_S)
         
   {
                
element.Courses= contexto.Courses.Where(c => c.Students.Any(s => s.StudentId == element.StudentId)).ToList();
          
  }
//我知道我可以做一个投影来消除所有我不需要的字段,这只是为了尝试一下

我做错了吗


它起作用了,但怎么可能呢?

如果添加
virtual
如:
public virtual ICollection Courses{get;set;}
您应该加载这些课程

但是,我建议使用延迟加载,因为它可能会导致性能问题,您需要做的是快速加载

因此,当您询问您的学生时,您只需执行以下操作:
dbContex.Students.Include(c=>c.Courses.ToList()

数据库查询中较慢的部分之一是将数据传输到计算机。因此,最好只传输您计划使用的数据

在实体框架中使用LINQ时,使用是准确指定要传输的数据的好方法。这通常是在您的最终ToList/ToDictionary/FirstOrDefault/Single/之前完成的

你想要所有的学生,每个人都有自己的课程。如果查看表,您会发现表中的数据比您想要的多。例如,每个学生都有一个Id,他的每门课程都有相同的StudentId值。因此,如果一个学生参加了20门课程,那么你将为StudentId转移相同的值21次

因此,为了提高查询效率:只选择您计划使用的学生的属性,只选择您感兴趣的这些学生的课程属性

这将自动解决您的问题:

var result = myDbcontext.Students

    // if you don't want all Students, use a Where:
    .Where(student => student.City = "Guadalajara")

    // Select only the properties you plan to use:
    .Select(student => new
    {
        Id = student.Id,
        Name = student.Name,
        Birthday = student.Birthday,
        Address = new 
        {
            Street = student.Street,
            City = student.City,
            ...
         }

         Courses = student.Courses
             // if you don't want all courses: use a where
             .Where(course => course.Start.Year == 2018)
             // again: select only the properties you plan to use
             {
                  Name = course.Name,
                  Location = course.Location,
                  ...
                  // One of the useless properties to transfer:
                  // StudentId = course.StudentId
              })
              .ToList();
      });

如果执行此查询:

var studentslist = dbContex.Students.ToList(); 
studentslist上的每个项目的“Courses”集合都将为null,因为尽管(每个表之间)存在连接/关系,但您没有指定要填充该集合。为此,您可以相应地更改查询:

var studentslist = dbContex.Students.Include(p => p.Courses).ToList();

现在,在运行最后一个查询后,如果您得到一个/任何项目的空列表,则表示这些项目(学生)没有链接到任何课程。

非常感谢您在本项目中为mi提供的帮助,所以我是对的,LINQ只会询问我的要求??当然,我想这样做,但不记得怎么做,因为我刚才看到了。因此,对于我来说,要添加一个新学生并首先链接到正确的课程,我必须将课程表加载到我的上下文中,让ChangeTracker知道我为这个新学生设置的课程id已经存在于数据库中,那么我如何分配它???我想我可以在那里填写课程集,只要有id,join table就会知道了???@CarlosEcheverriaSt抱歉,你能解释清楚吗?我有点困惑。我不太明白你们的意思。你们太多了,你们真的在帮助我提高我的自我!!!!!!!!!!也可以是`dbContex.Include(c=>c.Courses.Students.ToList();`在这里,我不应该首先告诉dbcontext wich表,因为如果我写
dbContex.Include()
我们有一个错误,糟糕的是,我只是把它写在我的头上。我会修改我的答案。是的,但是谢谢。。我还读到,为了使用lambda而不是神奇字符串,我们使用system.data.Entity,我不遵循,
.Include(c=>c.Courses)
是lambda,它位于
system.data.Entity
的命名空间下。您所指的是
。包括(“课程”)
var studentslist = dbContex.Students.Include(p => p.Courses).ToList();