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

时间:2017-01-27 11:56:48

标签: c# linq linqpad

我是一位经验丰富的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中遇到的错误是:无法执行文本选择:&#39; Lib.Course&#39;不包含&#39;选择&#39;的定义没有扩展方法&#39;选择&#39;接受类型&#39; Lib.Course&#39;的第一个论点。可以找到(按F4添加using指令或汇编引用)

3 个答案:

答案 0 :(得分:2)

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

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

select new {
  c.name,
  c.Students
}

答案 1 :(得分:0)

简单地写一下:

Date.tomorrow.to_formatted_s(:long_ordinal)
#=> "January 28th, 2017"

它将为您提供以var res = Courses.Where(x => c.name.StartsWith("Computing"));

开头的所有课程(与学生一起)

答案 2 :(得分:0)

要完全明确:

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”字段,这是我认为您所追求的。

因此,您的查询的主要问题是选择课程。学生集合:此集合包含学生对象,其中没有成员'学生'本身 - 所以您不能选择它。

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

另外,一般来说,我建议使用LINQ-Method-Chain而非LINQ-Query语法('from''select'等)。我发现更容易想到你正在有效处理的对象。它还帮助我分开SQL和LINQ语法 - 它们非常相似,但工作方式完全不同。