如何获取下面的代码以返回不同的记录。课程与课程结构之间的关系是一对多的
public IQueryable<object> GetCoursesDetails()
{
var query = (from c in db.Courses
from cs in db.CoursesStructures.Where(cs => cs.CourseID == c.CourseID).DefaultIfEmpty()
select new
{
CourseID = c.CourseID,
CourseName = c.CourseName,
CoursesStructures = db.CoursesStructures.Select(x => new
{
CourseStructureID = x.CourseStructureID,
CourseID = x.CourseID,
StructureName = x.StructureName
}).Where(k => k.CourseID == c.CourseID)
});
return query;
}
答案 0 :(得分:2)
在我看来,问题是你使用了第二个from
条款 - 你根本没有使用cs
,所以为什么要烦恼呢?它只是引入了复制,因为你在每个匹配的课程结构中选择了一个结果。
我实际上会使用join ... into
子句,然后在select
中使用结果:
var query = from c in db.Courses
join cs in db.CoursesStrutures
on c.CourseID equals cs.CourseID
into structures
select new
{
c.CourseID,
c.CourseName,
CoursesStructures = structures.Select(x => new
{
x.CourseStructureID,
x.StructureName
}
};
(我已从嵌套的匿名类型中移除了CourseID
,因为它显然与外部类型相同...我还使用了投影初始化程序简化代码 - 您可以在匿名类型初始值设定项中将Foo = x.Foo
缩短为x.Foo
。)