我是一位经验丰富的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指令或汇编引用)
答案 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语法 - 它们非常相似,但工作方式完全不同。