c# - LINQ to SQL "aggregating"属性

标签 c# .net linq linq-to-sql

假设我有一张订单表和一张付款表。

每笔付款都与给定的订单相关: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/

相关文章:

linq 计数错误 : DbExpressionBinding requires an input expression with a collection ResultType. 参数名称:input

java - 什么是 Linq 和 Entity Framework 的 Java 等价物

c# - MVC View 模型继承和创建操作

c# - WPF ViewModel 类中的调度程序

c# - 不同系统配置的最佳IO线程数

c# - 在 Linux 上运行 .NET Core——什么都不写

c# - 如何在 Linq 中执行左外连接

c# - 无法确定条件表达式的类型,因为 'int' 和 '<null>' 之间没有隐式转换

c# - 表中的数据未出现在 ASP.NET 页面上

x64 上的 .NET 客户端配置文件