C# 尝试获取“时获取错误”;职系;对于StudentId=1
我有以下实体和数据库上下文类C# 尝试获取“时获取错误”;职系;对于StudentId=1,c#,entity-framework,linq,entity-framework-core,C#,Entity Framework,Linq,Entity Framework Core,我有以下实体和数据库上下文类 public class Grade { public int Id { get; set; } public string GradeName { get; set; } public virtual ICollection<Student> Students { get; set; } = new HashSet<Student>(); } public class Student { public i
public class Grade
{
public int Id { get; set; }
public string GradeName { get; set; }
public virtual ICollection<Student> Students { get; set; } = new HashSet<Student>();
}
public class Student
{
public int Id { get; set; }
public string StudentName { get; set; }
}
public class SchoolContext : DbContext
{
public DbSet<Grade> Grades { get; set; }
public DbSet<Student> Students { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(@"Server=(localdb)\MSSQLLocalDB;Database=SchoolDB;Trusted_Connection=True;");
}
}
不能按条件包括导航属性。Include只能包含lambda to导航属性,无任何条件。要解决您的问题,您应该将导航属性“年级”添加到班级学生,并从包括年级在内的学生中进行选择
public class Student
{
public int Id { get; set; }
public string StudentName { get; set; }
public Grade StudentGrade { get; set; }
}
…
var data = context.Students.Include(x => x.Grade).Where(c => c.Id == studentId).SingleOrDefault();
我正在寻找解决方案,但不在学生类中添加年级属性
因此,您希望能够为学生
获得成绩
,但不希望将成绩
导航属性添加到学生
中,让EF核心为您自然处理?换句话说,失去了ORM最大的好处之一,开始为ORM可以用简单属性访问器处理的简单请求寻找SQL-ish解决方案
有很多方法可以满足你的需求,但我建议你先问问自己是否真的需要
无论如何,一种可能的解决方案是将集合导航属性与Any
一起用作过滤器:
var studentGrade = context.Grades
.FirstOrDefault(grade => grade.Students.Any(student => student.Id == studentId));
另一种方法是使用与SQL查询等效的LINQ:
var studentGrade = (
from grade in context.Grades
from student in grade.Students
where student.Id == studentId
select grade).FirstOrDefault();
.SingleOrDefault()
用于仅包含一个元素的序列。确定您的序列只有一个成员吗?是的,即使是ToList()
给出相同的错误,也可以这样尝试=>var data=context.Grades.Include(x=>x.Students.SingleOrDefault(x=>x.Id==studentId)
@er sho,x=>x.Id
是年级的Id
,而不是student
,我需要通过StudentId
只需按Id选择学生并包括年级(你应该将导航属性grade添加到学生类中)。好的,谢谢。我正在寻找不在Student
Classis中添加Grade
属性的解决方案,我理解这一点,但对于我的问题,我无法更改实体类。。。我用的都是ODATA ef
var studentGrade = (
from grade in context.Grades
from student in grade.Students
where student.Id == studentId
select grade).FirstOrDefault();