Ser*_*ier 4 .net c# linq linq-to-sql
假设我有一张桌子Orders和一张桌子Payments.
每笔付款都与给定订单相关:Payment.orderId
我想查询我的订单:
var query = from o in db.Orders where o.blah = blah select o;
Run Code Online (Sandbox Code Playgroud)
但我还需要每笔订单的总付款额:
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()
};
Run Code Online (Sandbox Code Playgroud)
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()"
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
通常,您的Order类将具有一个名为的导航属性Payments.利用这个,您的TotalPaid财产将如下所示:
public double TotalPaid
{
get { return Payments.Sum(x => x.Amount); }
}
Run Code Online (Sandbox Code Playgroud)
这解决了另一个问题:此属性始终是最新的.只要在订单中添加新付款,您的方法就会过时.
如果最新并不是那么重要但减少了到数据库的往返次数,您可以使用以下代码:
private double? _totalPaid;
public double TotalPaid
{
get
{
if(!_totalPaid.HasValue)
_totalPaid = Payments.Sum(x => x.Amount);
return _totalPaid.Value;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
231 次 |
| 最近记录: |