Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.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# 尝试获取“时获取错误”;职系;对于StudentId=1_C#_Entity Framework_Linq_Entity Framework Core - Fatal编程技术网

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();