如何在linq左联接查询中使用现有的左模型预填充投影结果

时间:2018-12-12 11:04:24

标签: c# linq

假设我有以下代码(简化),使用linq to sql与左外部联接:

public class Program
{
    public static void Main()
    {       
        IList<Payment> paymentsList = new List<Payment>() { 
                new Payment() { ID = 1, Amount = 4 } ,
                new Payment() { ID = 2, Amount = -11 } ,
                new Payment() { ID = 3, Amount = 11 }
            };

        IList<Allocation> allocationList = new List<Allocation>() { 
                new Allocation(){ OriginalID = 1, ReversalID=2},
                new Allocation(){ OriginalID = 2, ReversalID=3}             
            };

        var summaryPayments = from s in paymentsList 
                            join alloc in allocationList on s.ID equals alloc.OriginalID into allocOrg
                            from po in allocOrg.DefaultIfEmpty()
                            join allocRev in allocationList on s.ID equals allocRev.ReversalID into allocRevs
                            from pr in allocRevs.DefaultIfEmpty()
                            select new Payment{Amount=s.Amount, ReversalId = (pr != null ? pr.ReversalID : 0)};

        foreach (var obj in summaryPayments)
        {

            Console.WriteLine("{0} - {1}", obj.Amount,obj.ReversalId);
        }

    }

}

public class Payment{

    public int ID { get; set; }
    public decimal Amount { get; set; } 
    public int? ReversalId { get; set; }    
}

public class Allocation{
    public int OriginalID {get;set;}
    public int ReversalID { get; set; } 
}

我工作了,但我想知道是否有可能用现有模型中的属性来预填充投影结果模型,而无需手动初始化所​​有属性,而只是从“正确的”集合中填充属性。对于上述情况,我希望能够编写如下内容:

var summaryPayments = from s in paymentsList 
                            join alloc in allocationList on s.ID equals alloc.OriginalID into allocOrg
                            from po in allocOrg.DefaultIfEmpty()
                            join allocRev in allocationList on s.ID equals allocRev.ReversalID into allocRevs
                            from pr in allocRevs.DefaultIfEmpty()
                            select () {var model = s; model.ReversalId = (pr != null ? pr.ReversalID : 0);return model;};

1 个答案:

答案 0 :(得分:2)

尝试下面的代码

            var summaryPayments = (from s in paymentsList
                               join alloc in allocationList on s.ID equals alloc.OriginalID into allocOrg
                               from po in allocOrg.DefaultIfEmpty()
                               join allocRev in allocationList on s.ID equals allocRev.ReversalID into allocRevs
                               from pr in allocRevs.DefaultIfEmpty()
                               select new { s, pr }).Select(x => { x.s.ReversalId = (x.pr != null ? x.pr.ReversalID : 0); return x.s; });