LINQ to SQL"聚合"属性

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)

我怎样才能做到这一点?

Dan*_*rth 7

通常,您的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)