实体框架查找结果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;
}
这里发生的是,在第一种情况(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();