请针对我的要求提出linq查询

请针对我的要求提出linq查询,linq,Linq,任何人都可以针对以下要求提出linq查询 表单上有一个复选框..当我们点击它时..根据下面的数据表,它必须根据项目代码,总和(SoldQty),库存和,最新销售记录值,金额,说明进行分组 你不能分组。以下列 solddate-显示最新的销售日期 部门 类别 一般查询 var resQuery = from i in someQueryable group i by new {i.groupProperty1, i.groupProperty2} into g

任何人都可以针对以下要求提出linq查询

表单上有一个复选框..当我们点击它时..根据下面的数据表,它必须根据
项目代码
总和(SoldQty)
库存和
最新销售记录值
金额
说明
进行分组

你不能分组。以下列

  • solddate
    -显示最新的销售日期
  • 部门
  • 类别


  • 一般查询

    var resQuery = from i in someQueryable
                  group i by new {i.groupProperty1, i.groupProperty2} into g
                              select new
                              {
                                  Property1 = g.Key.Property1,
                                  Property2 = g.Key.Property2
                                  Total = g.Sum(p => p.SumProperty),
                                  /// other properties
                              };
    
    对于您的示例数据,它可能类似于:

    var resQuery = from i in dbContext.Items
                  group i by new{ i.ItemCode, i.Description, i.UOM} into g
                              select new
                              {
                                  ItemCode = g.Key.ItemCode,
                                  TotalSold = g.Sum(p => p.SoldQty),
                                  Description = g.Key.Description,
                                  UOM =g.Key.UOM
                                  /// other properties
                              };
    
    在Ideone上尝试以下示例:

    类似的问题被问了很多次:


    下面是我的代码,它工作正常,但只有第一行的soldqty和Amount值翻倍。而其他行的数据正常。我无法理解为什么只有第一行的数据总和(soldqty)翻倍

    decimal? SoldQty, stockinhand,SellPrice,Amount,CostPrice;
     string ItemCode, Description,UOM,BarCode,SoldDate,Department,Category,User;
      var resQuery = from row in dtFilter.AsEnumerable()
    group row by row.Field<string>("Item Code") into g
     select dtFilter.LoadDataRow(new object[]
     {
     ItemCode=g.Key,
     Description=g.Select(r=>r.Field<string>("Description")).First<string>(),
     UOM=g.Select(r=>r.Field<string>("UOM")).First<string>(),  
     SoldQty = g.Sum(r => r.Field<decimal?>("Sold Qty")).Value,
     stockinhand=g.Select(r=>r.Field<decimal?>("Stock in Hand")).First<decimal?>(),
     SellPrice=g.Select(r=>r.Field<decimal?>("Sell Price")).First<decimal?>(),
     Amount = g.Sum(r => r.Field<decimal?>("Amount")).Value,
     CostPrice = g.Sum(r => r.Field<decimal?>("Cost Price")).Value,
     BarCode=g.Select(r=>r.Field<string>("Barcode")).First<string>(),
     SoldDate=g.Select(r=>r.Field<string>("SoldDate")).Last<string>(),
     Department=g.Select(r=>r.Field<string>("Department")).First<string>(),
     Category=g.Select(r=>r.Field<string>("Category")).First<string>(),
     User=g.Select(r=>r.Field<string>("User")).First<string>(),  }, false);
    
    decimal?解决数量、库存、售价、金额、成本价;
    字符串项编码、说明、计量单位、条形码、数据表、部门、类别、用户;
    var resQuery=来自dtFilter.AsEnumerable()中的行
    按行将字段(“项目代码”)分组为g
    选择dtFilter.LoadDataRow(新对象[])
    {
    ItemCode=g.Key,
    Description=g.Select(r=>r.Field(“Description”)).First(),
    UOM=g.选择(r=>r.字段(“UOM”)).First(),
    SoldQty=g.Sum(r=>r.Field(“售出数量”)。值,
    stockinhand=g.Select(r=>r.Field(“库存”)).First(),
    SellPrice=g.Select(r=>r.Field(“售价”)).First(),
    金额=g.总和(r=>r.字段(“金额”)。值,
    CostPrice=g.Sum(r=>r.Field(“成本价格”))。值,
    条形码=g.选择(r=>r.字段(“条形码”)).First(),
    SoldDate=g.Select(r=>r.Field(“SoldDate”)).Last(),
    Department=g.Select(r=>r.Field(“Department”).First(),
    Category=g.Select(r=>r.Field(“Category”).First(),
    User=g.Select(r=>r.Field(“User”)).First(),},false);
    
    要获得更清晰的数据,请点击此链接。您好,谢谢您的回复。它正在部分工作。。。如何获取其他字符串列,如Description、UOM等,方法与获取
    ItemCode
    (建议这些是
    Item
    的属性)的方法相同,如在我的更新答案中。执行查询时(例如,
    resQuery.ToList()
    ),它将返回匿名对象的
    List
    (由编译器生成)使用您指定的属性。您好,Mipe34,我几乎完成了。唯一的错误是,当我对Soldqty进行求和时,它会执行两次。我的意思是,如果ItemCode Soldqty 100 2 100 1,那么求和应该是3。但我得到了6。除此之外,没有问题,谢谢。我已经为您创建了关于Ideone的工作示例:并在我的示例中更正了语法回答。附言。你不需要感谢我,只要在我的回答对你有帮助的情况下将其标记为已回答;-)嗨…Sum(SoldQty)和Sum(Amount)的第一行数据增加了一倍,而对于其他行,则是好的。你不应该将问题的扩展部分作为答案。请使用此答案中的代码扩展您的问题,然后删除此帖子。
    decimal? SoldQty, stockinhand,SellPrice,Amount,CostPrice;
     string ItemCode, Description,UOM,BarCode,SoldDate,Department,Category,User;
      var resQuery = from row in dtFilter.AsEnumerable()
    group row by row.Field<string>("Item Code") into g
     select dtFilter.LoadDataRow(new object[]
     {
     ItemCode=g.Key,
     Description=g.Select(r=>r.Field<string>("Description")).First<string>(),
     UOM=g.Select(r=>r.Field<string>("UOM")).First<string>(),  
     SoldQty = g.Sum(r => r.Field<decimal?>("Sold Qty")).Value,
     stockinhand=g.Select(r=>r.Field<decimal?>("Stock in Hand")).First<decimal?>(),
     SellPrice=g.Select(r=>r.Field<decimal?>("Sell Price")).First<decimal?>(),
     Amount = g.Sum(r => r.Field<decimal?>("Amount")).Value,
     CostPrice = g.Sum(r => r.Field<decimal?>("Cost Price")).Value,
     BarCode=g.Select(r=>r.Field<string>("Barcode")).First<string>(),
     SoldDate=g.Select(r=>r.Field<string>("SoldDate")).Last<string>(),
     Department=g.Select(r=>r.Field<string>("Department")).First<string>(),
     Category=g.Select(r=>r.Field<string>("Category")).First<string>(),
     User=g.Select(r=>r.Field<string>("User")).First<string>(),  }, false);