实体框架查找结果vs LINQ结果

本文关键字:结果 vs LINQ 查找 框架 实体 | 更新日期: 2023-09-27 18:01:52

我是一个新的。net开发人员。我有两个这样的实体类

public class Student
{
    public int userId { get; set; }
    public string username { get; set; }
    public string firstname { get; set; }
    public string lastname { get; set; }
    public string email { get; set; }
    public Course course { get; set; }
}
public class Course
{
    [Key]
    public int courseId { get; set; }
    public String courseName { get; set; }
}

我正在使用这样的DB上下文对象

using (MyDbContext db = new MyDbContext())

当我使用

访问Student对象时
Student stdent = db.students.Find(1);

学生对象中本机类型(int,string)的成员变量包含值,但类型(course)的课程变量返回null。

然而,当我使用

var result = from student in db.students where student.userId == 1 select student;

结果包含所有成员变量的值(这里包含整个课程对象)

这是预期的行为还是我错过或忽略了什么?

我甚至在我的DB上下文中添加了这个构造函数来禁用延迟加载,但没有帮助

    public MyDbContext() : base()
    {
        this.Configuration.LazyLoadingEnabled = false;
    }

实体框架查找结果vs LINQ结果

这里发生的是,在第一种情况(Find)中,您从数据库中获取对象。Course不是惰性加载,所以Course的引用是null

在第二种情况下,你只定义了一个查询,但没有执行它。我假设您在之后循环遍历结果,同时检查Course是否存在。这导致Course被加载,因为您在执行时访问Course导航属性,它已成为查询的一部分。

如果你这样做

var s = (from student in db.students where student.userId == 1 select student)
        .Single();

你会注意到Course是空的,因为在执行查询时(Single语句)没有引用Course来获取学生。

延迟加载只加载初始对象。为了获得第二个选项来检索课程信息,您需要在加载选项中指定。

DataLoadOptions dataLoadOptions = new DataLoadOptions();
dataLoadOptions.LoadWith<Customer>(c => c.Course);
db.LoadOptions = dataLoadOptions;
Student stdent = db.students.Find( c=>c.userid == 1).FirstOrDefault();