【问题标题】:unable to draw chart of highest sold products无法绘制销量最高的产品图表
【发布时间】:2020-12-07 21:29:07
【问题描述】:

我有一张已售产品表,我想绘制前 10 名销量最高的产品图表。

尝试使用以下代码,但我不知道确切的问题是什么,但逻辑上是正确的。

这是错误

System.ArgumentException: 'DbExpressionBinding 需要一个带有集合 ResultType 的输入表达式。参数名称:输入'

       DateTime start = startDate.Value;
       DateTime end   = EndDate.Value;            
        var TopTen = (from q in db.soldProduct                          
                      where (q.addDate >= start && q.addDate <= end)
                      orderby q.Barcode.Count() descending
                      select new 
                      {
                          count = q.Barcode.Count(),
                          q.productName
                      }).Take(10);

        foreach (var item in TopTen)
        {
            chartCustomer.Series["Customer"].Points.AddXY(item.productName, item.count);

        }

添加:- 我在每一行中都有项目名称和可能是一个或多个的数量,我也想将其添加到查询中,但它变得越来越难

销售单的型号产品包含以下内容

 public string barcode {get;set;}
 public int productId{get;set;}
 public string productName{get;set;}
 public int quantity{get;set;}
 public DateTime  addDate{get;set;}
 public double amount{get;set}

如果有以下数据,那么表

productId barcode productName quantity addDate amount
1 111 milk 3 3/2/2020 15
1 111 milk 1 3/2/2020 5
2 222 bread 5 3/2/2020 20
3 333 cheese 1 3/2/2020 100
1 111 milk 3 3/2/2020 15
2 222 bread 3 3/2/2020 15

销量最高的商品是面包,出现 8 次,它应该首先出现,然后是牛奶,出现 7 次,然后是奶酪。

【问题讨论】:

  • 什么 LINQ:LINQ to SQL / EF 6.x / EF Core 2.0 / 2.1 / 3.x / 5.x? Barcode 是什么?
  • linq to sql server ,产品条码为varchar
  • 没有 linq to sql server - 你的意思是 linq to sql,还是使用实体框架?
  • 没有 C# 类型 varchar - 如果 Barcodestring 那么您希望 string 上的 Count() 返回什么?
  • 我正在使用实体框架来 sql server 数据库

标签: c# winforms linq


【解决方案1】:

cmets 之后的加法:
显然每个 SoldProduct 都有一个属性 Amount。您不想计算已售产品的数量,而是要计算所有已售产品的总金额。

因此,如果产品“Milk”的 SoldProduct1 的金额为 10,产品“Milk”的 SoldProduct[22] 的金额为 14,那么您希望产品“Milk”的结果是 24 件商品已售出(= 10 + 14).
评论结束后添加

所以你有一张桌子,SoldProducts。此表中的每一行代表一个产品的一次销售。

表 SoldProducts 有 a.o.至少以下列

  • AddDate: 什么时候打折
  • ProductName:所售商品的名称,
  • Amount:本次销售的商品数量。

我想要……销量最高的 10 款产品

“销量最高的产品”可能与已售产品的高度无关,而是与已售产品的总数量有关。

要计算这一点,您需要创建具有相同名称的 SoldProducts 组。您将获得名称为“面包”的已售产品组和名称为“牛奶”等的已售产品组。

然后你想对每组所有已售产品的总金额求和。

因此,如果组“Bread”有 3 个 SoldProducts,数量分别为 10、7、5,那么您想要的结果是:["Bread", 22]。 22 是售出的面包总数。 您按 TotalAmount 的降序对分组项目的结果进行排序,并取前 10 个项目。

通过Enumerable.GroupBy 的重载之一来根据共同点对元素进行分组。在这种情况下,我使用带参数 resultSelector 的重载来计算每个组中的元素数。

DateTime beginDate = ...
DateTime endDate = ...
var topTenSoldProductNames = dbContext.SoldProducts
    .Where(soldProduct => beginDate <= soldProduct.AddDate
                       && endDate >= soldProduct.AddDate)
    // make groups with same ProductName
    .GroupBy(soldProduct => soldProduct.ProductName,

    // parameter resultSelector: take each ProductName, 
    // and all SoldProducts with this ProductName to make one new
    (productName, soldProductsWithThisProductName) => new
    {
        Name = productName,

        TotalAmount = soldProductsWithThisProductName
            .Select(soldProduct => soldProduct.Amount)
            .Sum(),
    })

    // order by descending TotalAmount, and take the first 10
    .OrderByDescending(groupResult => groupResult.TotalAmount)
    .Take(10);

【讨论】:

  • 这是非常好的逻辑,我很感激,最后一件事,如果我每行出售的商品数量可能是一个或多个,每张账单将包含单个商品的名称,但数量任意在我将其标记为答案之前将其添加到您美丽的查询中的方法
  • 谢谢@Harald Coppoolse 它是基于项目数量的出现,我在上面添加了一个表格以使其更清楚,如果我们根据数量检查某些项目将具有更多价值但出现一次(售出数量),这就是为什么我必须计算数量出现它会显示我们售出的许多物品
  • 现在你应该知道该怎么做了。显然 BarCode 是您产品的一些标识,因此您应该按 BarCode 分组:检查相同的 int 比检查相同的文本更快。您不应该对金额求和,而是对数量进行求和
【解决方案2】:

您的查询错误,您返回的字符数。而且不分组这个查询是没有用的。

var groupingQuery = 
   from q in db.soldProduct                          
   where (q.addDate >= start && q.addDate <= end)
   group q by q.productName into g
   select new
   {
      productName = g.Key,
      count = g.Count(),
   };

var TopTen = groupingQuery.OrderByDescending(x => x.count).Take(10);

【讨论】:

  • 谢谢您,请您查看问题中添加的注释
  • 也许是时候将您的模型添加到问题中了。
  • 向此查询添加数量?作为总和?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 2016-01-19
  • 1970-01-01
相关资源
最近更新 更多