一对多 LINQ 查询 - 程序集没有 SELECT 的定义

One to Many LINQ query - Assembly does not have definition for SELECT

我是一位经验丰富的 SQL 开发人员,正在尝试学习 LINQ。假设我有以下 类:

    public partial class Course
        {
            public Course()
            {
                this.Students = new HashSet<Student>();
                this.Students1 = new HashSet<Student>();
            }

            public int id { get; set; }
            public string name { get; set; }

            public virtual ICollection<Student> Students { get; set; }
            public virtual ICollection<Student> Students1 { get; set; }
        }

public partial class Student
    {
        public Student()
        {
            this.Courses = new HashSet<Course>();
        }

        public int id { get; set; }
        public string name { get; set; }
        public Nullable<int> age { get; set; }
        public Nullable<int> courseid { get; set; }

        public virtual Course Course { get; set; }
        public virtual ICollection<Course> Courses { get; set; }
    }

我正在尝试让所有学生参加计算机课程,即学生对象应该作为课程对象中的集合返回。我试过这个:

from c in Courses
.Include(s => s.Students)
.Where(c => c.name.StartsWith("Computing"))

select new {
c.name,
Students = c.Select(x => x.Students)

}

我在 LINQPAD 中得到的错误是:无法执行文本选择:'Lib.Course' 不包含 'Select' 的定义并且没有扩展方法 'Select' 接受类型为第一个参数 'Lib.Course' 可以找到(按 F4 添加 using 指令或程序集引用)

简单写:

var res = Courses.Where(x => c.name.StartsWith("Computing"));

它将为您提供所有以 Computing

开头的课程(包括学生)

课程不是 IEnumerable,因此它不支持 Select 方法。如我所见,您使用 LINQ 查询语法(不是其他解决方案建议的方法语法),因此您必须在代码中使用它:

from c in Courses
  .Include(s => s.Students)
  .Where(c => c.name.StartsWith("Computing"))

select new {
  c.name,
  c.Students
}

完全明确地说:

var computerCourses = context.Students
   .Where(c => c.name.StartsWith("Computing"));
   .SelectMany(c => 
          c.Students.Select(s => new { CourseName = c.name, Student = s })
   .ToList();

这将为您提供一个 平面列表 的匿名类型,其中包含字段 'CourseName' 和 'Student',这就是我认为您想要的。

所以您查询的主要问题是 Course.Students 集合上的 Select:此集合包含 Student 对象,它们本身没有成员 'Students' - 所以你不能 select 那。

我建议在 Visual Studio 中编写这些内容。像这样,您的编译器会准确地告诉您哪条语句不正确,而不仅仅是该行。

此外,通常我建议使用 LINQ-Method-Chain 而不是 LINQ-Query 语法('from' 'select' 等)..我发现考虑对象更容易你正在有效地处理。它还帮助我区分 SQL 和 LINQ 语法——它们非常相似,但工作方式却大不相同。