Lambda表达式分组在C#中

KLI*_*M8D 8 c# linq linq-group

我想将我的LINQ查询分组ItemNumber并返回整个表的总数Quantity.

Example:
ItemNumber - ItemName - Quantity
100          Item1       1
150          Item2       2
100          Item1       2
200          Item3       1
150          Item2       2

Should be:
ItemNumber - ItemName - Quantity
100          Item1       3
150          Item2       4
200          Item3       1
Run Code Online (Sandbox Code Playgroud)

这是我试图分组的查询:

public IQueryable<WebsiteOrderStatus> GetOrderStatusByAccountNumberWithoutDeleted
        (string accountNumber)
{
    return db.WebsiteOrderStatus
             .Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止我的最好结果(虽然这不能编译):

public IQueryable<IGrouping<Int32?, WebsiteOrderStatus>> lol(string accountNumber)
{
     db.WebsiteOrderStatus
       .Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1)
       .GroupBy(g => g.ItemNumber)
       .Select(g => new
                    {
                         g.Key.ItemNumber,
                         Column1 = (Int32?)g.Sum(p => p.Quantity)
                    });
 }
Run Code Online (Sandbox Code Playgroud)

编辑:

感谢大家的回复,我必须面对.在我看来,Theese匿名类型非常难以使用,所以我找到了另一个解决方案.

我做了另一种方法,它总结了用户项目的数量并将第一个项目分组.

public IQueryable<WebsiteOrderStatus> GetOrderStatusByAccountNumberWithoutDeleted(string accountNumber)
{
    return db.WebsiteOrderStatus.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1).GroupBy(x => x.ItemNumber).Select(grp => grp.First());
}

public int GetQuantityOfUsersItem(string accountNumber, string itemNumber)
{
    return db.WebsiteOrderStatus.Where(x => x.ItemNumber == itemNumber && x.AccountNumber == accountNumber).Sum(x => x.Quantity);
}
Run Code Online (Sandbox Code Playgroud)

在我有gridview的页面上,我做了:

var query = websiteOrderStatusRep.GetOrderStatusByAccountNumberWithoutDeleted(AppSession.CurrentLoginTicket.AccountNumber).Select(x => new { x.ItemName, x.ItemNumber, x.FormatName, x.Price, x.Status, x.Levering, Quantity = websiteOrderStatusRep.GetQuantityOfUsersItem(x.AccountNumber, x.ItemNumber)});
Run Code Online (Sandbox Code Playgroud)

vc *_* 74 10

public IQueryable<IGrouping<Int32?, WebsiteOrderStatus>> lol(string accountNumber)
{
     db.WebsiteOrderStatus
       .Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1)
       .GroupBy(g => g.ItemNumber)
       .Select(g => new
                    {
                         ItemNumber = g.Key,
                         ItemName = g.First().ItemName,
                         Count = g.Sum(item => item.Quantity)
                    });
 }
Run Code Online (Sandbox Code Playgroud)


Ama*_*ure 7

 public IQueryable<OrderStatus > lol(string accountNumber)
 {
     return db.WebsiteOrderStatus
        .Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1)
        .GroupBy(g => g.ItemNumber)
        .Select(g => 
                new OrderStatus //This is your custom class, for binding only
                {
                     ItemNumber = g.Key,
                     ItemName = g.First().ItemName,
                     Quantity = g.Sum(g => g.Quantity)
                }
        );
 }
Run Code Online (Sandbox Code Playgroud)

  • `实体可以在查询之外创建,并使用DataContext插入到数据存储中.然后,您可以使用查询检索它们.但是,您无法将实体创建为查询的一部分.在这种情况下,您必须创建一个用于绑定的自定义类,并将"WebsiteOrderStatus"映射到该类的对象. (2认同)

Dan*_*rth 5

我认为Select应该是:

   .Select(g => new
                {
                     ItemNumber = g.Key,
                     Column1 = (Int32?)g.Sum(p => p.Quantity)
                });
Run Code Online (Sandbox Code Playgroud)

注意匿名类型第一行的变化。分组的关键字已经是项目编号。


Jam*_*iec 5

我在查询中看到的唯一问题是

  1. return根据评论缺少陈述
  2. select语句应该是:

-

.Select(g => new {
       ItemNumber = g.Key,
       Total = g.Sum(p => p.Quantity)
    });
Run Code Online (Sandbox Code Playgroud)

编辑:如果你想在结果对象中得到ItemNumber和ItemName,你还必须对这些字段进行分组

db.WebsiteOrderStatus
   .Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1)
   .GroupBy(g => new { g.ItemNumber, g.ItemName })
   .Select(g => new
                {
                     ItemNumber = g.Key.ItemNumber,
                     ItemName = g.Key.ItemName,
                     Count = g.Sum(item => item.Quantity)
                });
Run Code Online (Sandbox Code Playgroud)