框架中的NULL子集合,在LINQPad中正常

问题描述 投票:0回答:1

我有这个继承的SQL视图代码,我转换为linq同时获取一些数据,在LINQPad中它按预期工作,但在转移到我的c#解决方案时,子加收不加载。

  var query = from poh in _pckOrderHeadeRepository.GetAllIncluding(pd => pd.PckOrderDetail)
                join mcs in _mstrConsigneeShipToRepository.GetAll() on poh.RouteId equals mcs.Consignee
        //select new {poh, mcs}; //works
        join det in (
            from d in _pckOrderDetailRepository.GetAllIncluding(pd=> pd.PckOrderHeader, pd => pd.MstrSku)
            join s in (
                from shpCartonHeader in _shpCartonHeaderRepository.GetAll()
                group shpCartonHeader by new
                {
                    shpCartonHeader.OrderNum
                }
                into g
                select new
                {
                    g.Key.OrderNum,
                    CartonWeight = g.Sum(p => p.TotalWeight)
                }) on d.PckOrderHeader.OrderNum equals s.OrderNum into sJoin
            from s in sJoin.DefaultIfEmpty()
            group new {d.PckOrderHeader, d, d.MstrSku, s} by new
            {
                d.PckOrderHeader.OrderNum
            }
            into g
            select new
            {
                g.Key.OrderNum,
                OrderQty = g.Sum(p => p.d.OrderQty),         
                OrderWeightOpen = (decimal?)g.Where(p => p.d.PckOrderHeader.OrderStat.Equals("OPEN")).Sum(p => p.d.MstrSku.Weight * p.d.OrderQty),
                OrderWeightReleased = (decimal?)g.Where(p => p.d.PckOrderHeader.OrderStat.Equals("RELEASED")).Sum(p => p.d.MstrSku.Weight * p.d.PickingQty + p.s.CartonWeight),
                 OrderWeightPacked = (decimal?)g.Where(p => p.d.PckOrderHeader.OrderStat.Equals("PACKED")).Sum(p => p.s.CartonWeight),
                PrePack = g.Max(p => p.d.MstrSku.Prepack)
            }) on poh.OrderNum equals det.OrderNum
        join toa in _shpTrailerOrderAssignmentRepository.GetAll() on poh.OrderNum equals toa.OrderNum into
        toaJoin
        from toa in toaJoin.DefaultIfEmpty()

        select new
        {
            det,
            poh,
            toa,
            mcs
        };

这部分特别是:

 select new
            {
                g.Key.OrderNum,
                OrderQty = g.Sum(p => p.d.OrderQty),         
                OrderWeightOpen = (decimal?)g.Where(p => p.d.PckOrderHeader.OrderStat.Equals("OPEN")).Sum(p => p.d.MstrSku.Weight * p.d.OrderQty),
                OrderWeightReleased = (decimal?)g.Where(p => p.d.PckOrderHeader.OrderStat.Equals("RELEASED")).Sum(p => p.d.MstrSku.Weight * p.d.PickingQty + p.s.CartonWeight),
                OrderWeightPacked = (decimal?)g.Where(p => p.d.PckOrderHeader.OrderStat.Equals("PACKED")).Sum(p => p.s.CartonWeight),
                PrePack = g.Max(p => p.d.MstrSku.Prepack)
            }) on poh.OrderNum equals det.OrderNum

例如:

PrePack = g.Max(p => p.d.MstrSku.Prepack) // MstrSku is not loaded

和p.d内的属性(PckOrderDetail)

public virtual MstrSku MstrSku { get; set; }

linqpad中的等效查询工作正常,所以我想知道我错过了什么,以正确加载子属性来模仿LINQPads行为。

c# entity-framework linq aspnetboilerplate
1个回答
0
投票

如果你想使用p.d.MstrSku.Prepack,那么你必须将它包含在外表中。当您将其包含在连接表中时,您无法选择。

在第一行中使用它,如下面的示例

.Include(x => x.OrderDetails.Select(y => y.MstrSku)).ToList(); 
© www.soinside.com 2019 - 2024. All rights reserved.