c# - 获取子记录列表

标签 c# linq linq-to-sql

我有一个如下所示的数据库:

tbl_Seminar
   ID
   isActive


tbl_SeminarFees
   ID
   seminar_id -- foreign key
   fee_text

我想获取所有事件的研讨会 (isActive ==1) 以及与该研讨会相关的费用列表。每个Seminar在tbl_SeminarFees中可能有n条记录是它的费用。我能够返回一个 linq 结构,它返回一个看起来像这样的对象列表 {seminar, SeminarFee}但我想创建一个如下所示的嵌套结构:

{seminar, List<SeminarFee>}

我的 linq 查询应该是什么样的?

这是我目前的 linq:

var results = from s in context.Seminar
              join p in context.SeminarFees on
              s.ID equals p.SeminarID

              where s.IsActive == 1
              select new 
              {
                  Seminar = s,
                  Fees = p

              };

如何更改它以获得这些列表:{seminar, List<SeminarFee>}

谢谢

更新

@lazyberezovsky 给了我一个使用组连接并进入另一个变量的好主意。但是我该如何循环遍历结果集。这是我现在拥有的:

foreach (var seminarAndItsFeesObject in results)
            {
                //do something with the seminar object 
                //do something with the list of fees
            }

然而,这给了我以下错误:

    Argument type 'SeminarFees' does not match the 
corresponding member type 
'System.Collections.Generic.IEnumerable`1[SeminarFees]'

我做错了什么?

谢谢

最佳答案

您可以使用 group join它根据键相等性(又名 join..into)对内部序列项目进行分组,以获得与研讨会相关的所有费用:

var results = from s in context.Seminar
              join f in context.SeminarFees on
                   s.ID equals f.SeminarID into fees // here 
              where s.IsActive == 1
              select new 
              {
                  Seminar = s,
                  Fees = fees
              };

您不能在服务器端调用 ToList()。但您可以稍后在客户端映射结果。


BTW 你可以定义navigation property Seminar 对象的费用:

public virtual ICollection<SeminarFee> Fees { get; set; }

在这种情况下,您将能够加载收费的研讨会:

var results = context.Seminar.Include(s => s.Fees) // eager loading
                     .Where(s => s.IsActive == 1);

关于c# - 获取子记录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17137834/

相关文章:

c# - XAttribute 生成虚假前缀

c# - 检查对象是否可以转换为特定值类型?

c# - 将 Linq 查询与 Entity Framework 一起使用时引发异常

linq - 如何使用 LINQ 连接子查询

c# - "Cleanly"使用 LINQ to SQL Server 部署 ASP.NET 应用程序

c# - 如何使用 OnStop 方法终止线程 (C#)

c# - 接口(interface)不能被实例化,但这是一个异常吗

c# - 为什么 ?.Any() 被归类为可为空的 bool 值?

linq - 使用lambda表达式连接2和3表的简单示例

sql - 使用 SQL Server Express 进行 SQL Server Standard 开发?