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

标签 c# sql linq lambda

如何让下面的代码返回不同的记录。类(class)和类(class)结构之间的关系是一对多的关系

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

最佳答案

在我看来,问题在于您对第二个 from 子句的使用 - 您根本没有使用 cs,那么为什么要费心呢?它只是引入了重复,因为您要为每个匹配的类(class)结构选择一个结果。

我实际上会使用 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。)

关于c# - 如何使用 LINQ 返回不同的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36594433/

相关文章:

mysql - 如何对行值求和并将结果保存在新的总计列中?

c# - LINQ 查询的位置

c# - 使用 Process.Start 打开 pdf 文件

javascript - 从 AngularJS 将复杂对象传递给 WebAPI

mysql - 选择一行中的两个空列并在其中任意一列中插入值

vb.net - LINQ - 按年和月分组

c# - 根据自定义优先级排序对象和选择

c# - 如何在 Blazor 服务器应用程序的服务注册中将访问 token 注入(inject)到 HttpClient?

c# - Outlook邮件转pdf安全提示

c# - 如何使用带有 STRING 参数的 SqlDependency