尝试获取StudentId = 1时出现错误,但出现错误

时间:2019-03-02 08:50:46

标签: 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 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;");
    }
}

在执行下面的代码时遇到错误,这里需要做什么。谢谢!

我正在寻找解决方案而未在Student类中添加Grade属性

  

System.InvalidOperationException:“包含属性lambda表达式'x => {来自x.Students中的学生c,其中[[c] .Id == __studentId_0} select [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();
    }

enter image description here

2 个答案:

答案 0 :(得分:2)

  

我在寻找解决方案而未在Student类中添加Grade属性

因此,您希望能够获得Grade的{​​{1}},但不想将Student导航属性添加到Grade并让EF Core自然为您处理?换句话说,失去最大的ORM好处之一,并开始为ORM可以使用简单属性访问器处理的简单请求寻找SQL式解决方案?

有很多方法可以做您想做的事,但我建议您先问问自己是否真的需要这样做。

无论如何,一种可行的解决方案是将集合导航属性与Student一起用作过滤器:

Any

另一种方法是使用与SQL查询等效的LINQ:

var studentGrade = context.Grades
    .FirstOrDefault(grade => grade.Students.Any(student => student.Id == studentId));

答案 1 :(得分:1)

您不能按条件包括导航属性。 Include只能包含lambda导航属性,没有任何条件。要解决您的问题,您应该将导航属性“成绩”添加到“班级”学生,然后从“包括成绩的学生”中进行选择。

{{1}}