假设我有以下代码(简化),使用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;};
答案 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; });