如何在Linq .NET中检索一个表行和与第一行连接的行列表

3
我有一个具体的问题。我对SQL不是很熟悉,所以这可能是一个愚蠢的问题。我有以下类。
class StructuredResult
{
    public Pay Pay{ get; set; }
    public Processing Processing{ get; set; }
    public Member Member { get; set; }

    public StructuredResult()
    {
    }
}

这是我使用的代码。
var allPaying = (from pay in Entities.Pays
                join prc in Entities.Processingss on pay.IDCalculation equals cal.IDCalculation
                join mbr in Entities.Members on pay.IDMember equals mbr.IDMember

                where pay.IDMember == IDMember
                orderby prc.DateFrom descending
                select new StructuredResult()
                {
                    Pay = pay,
                    Processing = prc,
                    Member = mbr
                }).ToList();

这段代码运行良好,我在这里做了一些更改以便发布,可能有一些名称更改不正确。 我需要得到的是:
class StructuredResult
{
    public Pay Pay{ get; set; }
    public Processing Processing{ get; set; }
    public Member Member { get; set; }
    public List<PayDetail> PayDetails { get; set; }

    public StructuredResult()
    {
    }
}

有人知道这是否可能吗?支付详细信息与Pay.ID = PayDetail.ID相关联。提前感谢。
2个回答

1
为了将StructuredResult也填充为PayDetail的集合,您需要使用Group Join。请参见:
  1. MSDN on GroupJoin
  2. 最后Linq to Entities join vs groupjoin
所以:
var allPaying = from pay in Entities.Pays
                join prc in Entities.Processingss on pay.IDCalculation equals cal.IDCalculation
                join mbr in Entities.Members on pay.IDMember equals mbr.IDMember
                join d in Entities.PayDetails on pay.IDMember equals d.ID into details

                where pay.IDMember == IDMember
                orderby prc.DateFrom descending

                select new StructuredResult()
                {
                    Pay = pay,
                    Processing = prc,
                    Member = mbr,
                    PayDetails = details
                };

我建议您使用 EF 时,考虑一下导航属性。通过稍微不同地定义类,您将获得更多的功能,而需要的代码量却更少(例如,无需编写连接语句)。
参考链接:
  1. MSDN - Entity Framework 关系和导航属性
  2. MSDN - 如何使用导航属性导航关系
此外,还有一个小提示 - 您正在定义一个没有逻辑的默认构造函数。如果在实际代码中也是这样的话,则没有必要定义它。因为它会被自动定义。

这似乎可以工作。我试过使用Entities.Pays.Include("PayDetails"),但它似乎没有立即加载。我如何仅为此禁用延迟加载?我希望所有内容都在那里可用,不在必要时进行延迟加载,因为大量计算和多个数据库查询需要时间。根据您目前所写的内容,效果要好得多,从平均130ms到5ms :) - Shakal187
@Shakal187 - 你可以在 details 后面加上 .ToList(),并且在整个查询周围也加上。更多的问题应该在另一个问题中提出 :) (还有许多其他问题回答这个后续问题)希望能帮到你。 - Gilad Green

1
这可能会对你有所帮助:
var allPaying = (from pay in Entities.Pays
                 join prc in Entities.Processingss on pay.IDCalculation equals cal.IDCalculation
                 join mbr in Entities.Members on pay.IDMember equals mbr.IDMember

                 where pay.IDMember == IDMember
                 orderby prc.DateFrom descending
                 select new StructuredResult()
                 {
                     Pay = pay,
                     Processing = prc,
                     Member = mbr,
                     PayDetails = (from pd in Entities.PayDetails
                                   where pd.ID == pay.IDMember
                                   select pd).ToList())
                 }).ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接