如何使用LINQ返回不同的记录

时间:2016-04-13 09:39:25

标签: c# sql linq lambda

如何获取下面的代码以返回不同的记录。课程与课程结构之间的关系是一对多的

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;
}

1 个答案:

答案 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。)