假设我有一张订单
表和一张付款
表。
每笔付款都与给定的订单相关:Payment.orderId
我要查询我的订单:
var query = from o in db.Orders where o.blah = blah select o;
但我还需要为每个订单支付的总额:
var query = from o in db.Orders
where o.blah = blah
select new
{
Order = o,
totalPaid = (from p in db.Payments
where p.orderId == o.id
select p.Amount).Sum()
};
LINQ to SQL 准确生成我想要的 SQL 查询。
我的问题是我正在为现有应用程序添加支付支持。因此,为了尽量减少代码影响,我希望 totalPaid
成为我的 Order
类的属性。
我想到了添加一个“手动”属性并尝试在查询时填充它。 但是写 select 子句是我卡住的地方:
var query = from o in db.Orders
where o.blah = blah
select "o with o.totalPaid = (from p in db.Payments <snip>).Sum()"
我该怎么做?
最佳答案
通常,您的Order
类会有一个名为Payments
的导航属性。利用它,您的 TotalPaid
属性将如下所示:
public double TotalPaid
{
get { return Payments.Sum(x => x.Amount); }
}
这解决了另一个问题:这个属性总是最新的。一旦向订单添加新付款,您的方法就会过时。
如果保持最新不是那么重要,而是减少往返数据库的次数,您可以使用此代码:
private double? _totalPaid;
public double TotalPaid
{
get
{
if(!_totalPaid.HasValue)
_totalPaid = Payments.Sum(x => x.Amount);
return _totalPaid.Value;
}
}
关于c# - LINQ to SQL "aggregating"属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6189558/