我下面有实体和数据库上下文类,
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;");
}
}
在执行以下代码时遇到错误,这里需要做些什么。谢谢!
我正在寻找解决方案而不在学生班级中添加成绩属性
System.InvalidOperationException:'包含属性lambda表达式'x => {来自x.Students中的学生c,其中[[c] .Id == __studentId_0}选择[c]}”无效。该表达式应表示属性访问:“ t => t.MyProperty”。要定位在派生类型上声明的导航,请指定目标类型的显式键入的lambda参数,例如'(派生d)=> d.MyProperty'。有关包括相关数据的更多信息,请参见http://go.microsoft.com/fwlink/?LinkID=746393。
static void Main(string[] args)
{
var studentId = 1;
var context = new SchoolContext();
var data = context.Grades.Include(x => x.Students.Where(c => c.Id == studentId)).SingleOrDefault();
}
最佳答案
我正在寻找解决方案而不在学生班级中添加成绩属性
因此,您希望能够获取Grade
的Student
,但又不想将Grade
导航属性添加到Student
并让EF Core自然为您处理呢?换句话说,失去最大的ORM好处之一,并开始为ORM可以使用简单属性访问器处理的简单请求寻找SQL式解决方案?
有多种方法可以满足您的需求,但是我建议您先问自己是否真的需要这样做。
无论如何,一种可行的解决方案是使用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();
关于c# - 尝试获取StudentId = 1的“成绩”时出错,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54956763/