【问题标题】:How to retrieve one table row and list of rows that are connected to the first row in Linq .NET如何检索一个表行和连接到 Linq .NET 中第一行的行列表
【发布时间】:2017-07-08 08:27:11
【问题描述】:

我有具体的问题。我对 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 相关联 提前致谢

【问题讨论】:

    标签: c# sql .net entity-framework linq


    【解决方案1】:

    为了也使用PayDetails 的集合填充StructuredResult,您需要使用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 Relationships and Navigation Properties
    2. MSDN - How to: Navigate Relationships Using Navigation Properties

    还有一个小提示 - 您正在定义一个默认构造函数,而 id 中没有任何逻辑。如果在真实代码中也是如此,那么就不需要它了。它是自动定义的。

    【讨论】:

    • 这似乎有效。我尝试使用 Entities.Pays.Include("PayDetails"),但它似乎没有立即加载。我如何才能为此禁用延迟加载?我希望以后有一切可用的东西,而不是在必要时延迟加载,因为计算量很大,对数据库的多次查询需要时间。就目前您所写的内容而言,效果要好得多,从平均 130 毫秒到 5 毫秒 :)
    • @Shakal187 - 您可以在details 之后添加.ToList(),也可以在整个查询周围添加。更多的应该是在一个单独的问题:) (还有许多其他问题也回答了这个后续问题)希望它有所帮助
    【解决方案2】:

    这可能会对您有所帮助:

    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();
    

    【讨论】:

      猜你喜欢
      • 2018-05-17
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2019-08-09
      相关资源
      最近更新 更多