C# 使用LINQ到SQL检索嵌套集合

C# 使用LINQ到SQL检索嵌套集合,c#,sql,linq,C#,Sql,Linq,我正在尝试获取一个TransferID列表,对于每个传输,一个ChargeID列表,对于每个传输,一个ReferralMatches列表 这是我得到的 (from c in Commissions where c.TransferStatus == "Paid" where c.AdminHasReleased == false join r in ReferralMatches on c.ReferralMatchId equals r.ReferralMatchId group c by n

我正在尝试获取一个TransferID列表,对于每个传输,一个ChargeID列表,对于每个传输,一个ReferralMatches列表

这是我得到的

(from c in Commissions
where c.TransferStatus == "Paid"
where c.AdminHasReleased == false
join r in ReferralMatches on c.ReferralMatchId equals r.ReferralMatchId
group c by new { c.TransferId } into grp
select new { 
   TransferId = grp.Key.TransferId,
   Charges = from c in grp
             group c by c.ChargeId into grp2
             select new { 
                ChargeId = grp2.Key, 
                Referrals = grp2 }
})
这是有效的,而且非常接近。它拉回的东西看起来像这样:

这看起来像是属于TransferId的费用,但我需要的是属于TransferId费用的ReferralMatches。我尝试了另一个选择来拉入“r”,但遇到了错误

我想LINQ的人可以从这篇文章中收集他们需要的信息,但是如果需要更多的信息,请告诉我。多谢各位

编辑、添加表格示例

这两个扩展表是我必须使用的。它可能没有什么用处,但请记住ReferralMatch表也有ChargeId。一个chargeId可以覆盖多个ReferralMatch,但一旦资金可用,就会发生银行转账……当发生这种情况时,会在佣金表中创建记录

所以我要找的是TransferID的列表,foreach Id是chargeId的列表,foreach chargeId是ReferralMatches的列表……最里面的ReferralMatches列表是该表中的完整记录

编辑,更多尝试

这是我的最新尝试

from c in Commissions
where c.TransferStatus == "paid"
group c by c.TransferId into transferGroup
select new {
    TransferId = transferGroup.Key,
    Charges = from c in transferGroup
              join r in ReferralMatches on c.ReferralMatchId equals r.ReferralMatchId
              group c by c.ChargeId into chargeGroup
              select new {
                ChargeId = chargeGroup.Key,
                Referrals = from r in chargeGroup
                            select new {
                                Referral = r
                            }
              }
}
这就引出了这样的问题:


但是,除非我读错了,最里面的项目仍然是佣金表,这是没有意义的。我需要它是ChargeId为[whatever]的ReferralMatches

您可能需要将表达式一分为二,在第一个表达式中遍历引用,然后在第二个表达式上分组,如下所示:

        var commissionAndReferrals = 
            from c in Commissions
            where c.TransferStatus == "Paid"
            where c.AdminHasReleased == false
            join r in ReferralMatches on c.ReferralMatchId equals r.ReferralMatchId
            select new { Commisson = c, Referral = r };

        var result =
            from cAndR in commissionAndReferrals
            group cAndR by cAndR.Commisson.TransferId into transferGroup
            select new
            {
                TransferId = transferGroup.Key,
                Charges = from c in transferGroup
                          group c by c.Commisson.ChargeId into chargeGroup
                          select new
                          {
                              ChargeId = chargeGroup.Key,
                              Referrals = chargeGroup.Select(x => x.Referral)
                          }
            };

我不清楚您到底想要实现什么-示例结果集看起来像一个TransferId列表,每个TransferId都有一个ChargeId列表(尽管示例中每个传输组只有一个),其中每个ChargeId都有一个ReferralMatches列表。您能指出您的示例数据的预期结果对象图应该是什么样子吗?你也可以发布佣金和推荐匹配的对象结构吗?是的,我会发布表格。示例结果确实是一个TransferID列表,对于每个ChargeID列表…但在其中是不正确的…我知道它说的是转介,但这些记录来自佣金表,而不是转介匹配表。我需要最里面的集合是基于chargeId的ReferralMatches的完整集合。张贴表格…太好了,谢谢更新。另一件事,从对象结构来看,每次传输似乎总是只有一个ChargeId,因此每次传输都不会有列表,对吗?我认为如果您将这个庞然大物分解为几个较小的查询,它会更有意义,并且更易于维护。抱歉,延迟了。关于每次传输一个chargeId,不,这只是以这种方式显示,因为我只有几个测试行。将有一个或多个属于费用的转介,也将有一个或多个属于转账的费用。这种情况下,会对大量转介进行付款或收费。一旦付款结清,就会发生银行转账。银行转账每天都会发生,可以支付当天结清的任何费用。所以:一次转移有多个费用,有多个行项目(推荐),感谢回复,在一个数据库快照中完成这一切将是非常甜蜜的,但如果没有其他内容,我对LINQ分组有很多了解。我想我会做一些性能测试,看看这种方法的优缺点是什么,或者仅仅使用几个点击来构建一个具有多个简单方法的复杂对象……或者就这一点而言,也许最好将所有数据推到单独的对象中,忘记嵌套,只在视图级别使用LINQ来收集和排序数据……嗯