一对多 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 语法——它们非常相似,但工作方式却大不相同。
我是一位经验丰富的 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 语法——它们非常相似,但工作方式却大不相同。