2

我目前被一小部分我似乎无法弄清楚的功能所困扰。

首先,我有一个Stock如下所示的类:

public class Stock
{
    public int Id;
    public int LocationId;
    public int Quantity;
}

Stock日志是从数据库返回的,这些日志是由另一个功能产生的。日志表示为一个List<Stock>集合 - 但是我需要添加Quantity相同IDLocationID组合的每个对象的属性,例如:

原始数据集:

编号:1 地点:1 数量:20

编号:1 地点:2 数量:30

编号:1 地点:1 数量:30

编号:2 地点:2 数量:20

编号:1 地点:2 数量:30

编号:1 地点:1 数量:100

应该返回:

精简数据集:

编号:1 地点:1 数量:150

编号:1 地点:2 数量:60

编号:2 地点:2 数量:20

重申一下:数据集是从数据库动态返回的,不能保证会有每个ID&组合,我需要结果数据集在andLocationID的复合键上是唯一的。IDLocationID

不确定解决此问题的最有效方法,并且它阻碍了我在项目中的进展,任何建议或方法将不胜感激。我有点认为这确实是一个知识差距,但我无法找到任何合适/符合我要求的东西(我猜这是一个很奇怪的要求)。

非常感谢,

安迪

4

4 回答 4

2

最好在数据库上执行此操作,但您也可以使用 GroupBy 来实现完全相同的效果:

public class Stock
{
    public int Id;
    public int LocationId;
    public int Quantity;
}

static void Main(string[] args)
{
    var list = new List<Stock>()
        {
            new Stock(){ Id = 1, LocationId = 1, Quantity = 20},
            new Stock(){ Id = 1, LocationId = 2, Quantity = 30},
            new Stock(){ Id = 1, LocationId = 1, Quantity = 30},
            new Stock(){ Id = 2, LocationId = 2, Quantity = 20},
            new Stock(){ Id = 1, LocationId = 2, Quantity = 30},
            new Stock(){ Id = 1, LocationId = 1, Quantity = 100},

        };

    var grouped = list.GroupBy(c => new {Id = c.Id, LocationId = c.LocationId})
            .Select(g => new 
                 { 
                      Id = g.Key.Id, 
                      LocationId = g.Key.LocationId, 
                      Quantity = g.Sum(a => a.Quantity) 
                  });
    foreach(var group in grouped.OrderBy(c => c.Id))
    {
        Console.WriteLine("Id:{0} - LocationId:{1} - Quantity:{2}", group.Id, 
                 group.LocationId, group.Quantity);
    }
}
于 2013-02-13T18:13:16.553 回答
2

用于GroupBy执行此操作:

var grouped = (from s in stocks
                group s by new { s.Id, s.LocationId }
                    into grp
                    select new Stock()
                    {
                        Id = grp.Key.Id,
                        LocationId = grp.Key.LocationId,
                        Quantity = grp.Sum(x => x.Quantity)
                    }).ToList();
于 2013-02-13T18:05:44.963 回答
1

我更喜欢使用这样的 SQL 查询:

select id, location, sum(quantity) quant from stocktable group by id, location

这有助于在数据库本身完成计算,从而帮助您提高性能。由于数据库服务器无论如何都会读取所有数据并将其提供给应用层,因此不会降低性能,并且您会在简单性方面获得收益。

于 2013-02-13T18:19:46.290 回答
0

您可以使用Enumerable.GroupBy来执行分组和Enumerable.Aggregate(或者,在这种情况下是专门的Sum)来执行聚合。

类似于以下内容:

IEnumerable<Tuple<int, int, int>> result =
    stocks.GroupBy(stock => new { id = stock.Id, locationId = stock.LocationId},
                   (key, s) => new { key.id, key.locationId, total = s.Sum(ss => ss.Quantity) });

foreach (var result in results)
{
    Console.WriteLine(result.id);
    Console.WriteLine(result.locationId);
    Console.WriteLine(result.total);
}
于 2013-02-13T18:03:59.157 回答