【问题标题】:No definition of Sum in linqlinq中没有Sum的定义
【发布时间】:2015-10-15 00:04:37
【问题描述】:

我编写了以下代码,我想在其中计算价格的总和。 但它没有说明总和的定义。可能有什么问题?

public virtual IList<DesignWiseTotal> summary(int customerId)
    {
        var query = _orderItemRepository.Table;

        return query.Where(oi => oi.Product.Designer_Id == customerId)
                        .Select(oi => new DesignWiseTotal
                        {
                            GrandTotal = oi.Sum(x => x.PriceExclTax),
                        });
    }

上面的代码和下面的代码非常相似,可以正常工作。以下代码通过麻线计算总和组。我在上面的代码中试图做的是计算一个客户的所有麻线的总数。

 public virtual IList<DesignWiseTotal> DesignWiseSplits(int customerId)
    {
        var query = _orderItemRepository.Table;

        return query.Where(oi => oi.Product.Designer_Id == customerId)
                        .GroupBy(oi => oi.Product.Twine)
                        .Select(oi => new DesignWiseTotal
                        {
                            Total = oi.Sum(x => x.PriceExclTax),
                            Twine = oi.Key,
                            }).ToList();
    }

我也附上了错误截图。

【问题讨论】:

  • 您的orderItemRepository 的Table 属性是什么?
  • 我正在使用 nopcommerce。它的 nopcommerce 语法来访问表。

标签: c# sql linq razor nopcommerce


【解决方案1】:

单个OrderItem(或从存储库中获得的任何类的名称)不是集合(例如IEnumerable、IQueryable 等),因此无法应用.Sum。

在第二个查询中,您对 Groups 的 .GroupBy(oi =&gt; oi.Product.Twine) 求和。每个组将有一个或多个元素,因此Sum 是允许的

不幸的是 lambda 参数名称的选择.. 更清楚的是:

.GroupBy(oi => oi.Product.Twine)
.Select(grp => new DesignWiseTotal ...

既然您想返回一个简单的标量值(总计),为什么不将方法签名更改为:

public virtual decimal DesignWiseSplits(int customerId)

然后

return query.Where(oi => oi.Product.Designer_Id == customerId)
            .Sum(oi => oi.PriceExclTax);

(或者我猜想返回单个 DesignWiseTotal 以及过滤后的客户的总和?)

(我当然希望oi.PriceExclTax 是十进制)

编辑

如果您保留此签名:

public virtual IList<DesignWiseTotal> summary(int customerId)

你可以使用:

return new List<DesignWiseTotal>
{  
   new DesignWiseTotal
   {
       GrandTotal = query.Where(oi => oi.Product.Designer_Id == customerId)
                         .Sum(oi => oi.PriceExclTax);
   }
};

虽然将标量作为类的数组返回似乎有点过头了。

【讨论】:

  • 感谢您提供如此详细的解决方案。请再告诉我一件事。我想将此总和存储在一个名为 GrandTotal 的变量中。怎么做?
  • 而不是 return query.Where(... 替换为 var GrandTotal = query.Where(...
  • 其实还有一个问题。我正在填充 DesignWiseTotal 类的变量 GrandTotal。但是由于现在没有使用 select 语句。我该怎么做?
  • 我已经更新了一个编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 2013-01-11
  • 2012-01-29
相关资源
最近更新 更多