使用LINQ表达式查找重复项时出现问题

3

我有一个ForecastData列表,它长这样:

public class ForecastData
{
    public string SalesID {get;set;}
    public string Customer {get;set;}
    public string Vendor {get;set;}
    public string Division {get;set;}
    public int Year {get;set;}
    public decimal Amount {get;set;}
}

我需要列出每个“客户”的所有不同的“销售ID”,这些“客户”在今年有金额> 0。目前,我正在按客户分组,但是因为我的数据集中可以为同一客户和销售ID具有多个“金额”,所以我没有得到期望的结果。我的结果显示:
1. 客户1 用户1 $100 2. 客户1 用户1 $200 3. 客户1 用户1 $300 4. 客户1 用户2 $100 5. 客户1 用户2 $200
但是我想要的是:
1. 客户1 用户1 $600 2. 客户1 用户2 $300
这是我的表达式:
var forecasts = (List<ForecastData>)cache.Get(_RAW_FORECAST_DATA_KEY, null);

foreach(var custGroup in forecasts.Where(f => f.Year == DateTime.Now.Year).GroupBy(f => f.Customer))
{
    if(custGroup.Count() > 1) // There's more than one forecast for this customer
    {
        foreach(var instance in custGroup)
        {
            toReturn.Add(new MultipleCustomer(custGroup.Key)
            {
                Salesperson = instance.SalesPersonId,
                Forecast = instance.Amount
            });
        }
    }
}

return toReturn;

请看这个 - Bob.
你一定需要对instance.Amount进行求和操作。你的group by仅会对客户对象进行排序。 - Matt R
2个回答

2

我认为,如果您更改查询,使其具有“外部”GroupBy和“内部”GroupBy,它将解决您的问题:

var forecasts = (List<ForecastData>)cache.Get(_RAW_FORECAST_DATA_KEY, null);

var forecastGroups = forcasts
    .Where(f => f.Year = DateTime.Now.Year)
    .GroupBy(f => f.Customer)
    .Where(grp => grp.Count() > 1)
    .Select(grp => new { Key = grp.Key, SalesGroups = grp.GroupBy(f => f.SalesId) });

foreach(var custGroup in forecastGroups)
{
    if(custGroup.SalesGroups.Count() > 1)
    {
        foreach(var salesGroup in custGroup.SalesGroups)
        {
            toReturn.Add(new MultipleCustomer(custGroup.Key)
            {
                Salesperson = salesGroup.Key,
                Forecast = salesGroup.Sum(f => f.Amount)
            });
        }
    }
}

return toReturn;

我已经尝试了这个方法,但是仍然没有得到我需要的结果。我感觉我需要先按客户分组,如果数量大于1,则再按售货员去重分组,如果有多个售货员,则显示该客户所有售货员的销售总额。 - Thelonias
我刚刚更新了我的答案,但根据你的评论,我认为我需要再修改一下。 - devuxer
不好,没有成功。我同意你的看法,我需要一个“外部”和“内部”分组…或者至少我认为是这样。 - Thelonias
我认为我不再有访问我的“客户”分组的权限了,我只能得到销售人员的Key(从最后一个GroupBy中)。因此,我无法创建一个MultipleCustomer对象,该对象需要一个客户字符串、一个销售人员字符串和一个总预测值。 - Thelonias
明白了!太棒了,非常感谢。我只需要做一个小改动就可以返回我需要的内容(在内部“foreach”周围添加if(custGroup.SalesGroups.Count() > 1))。再次感谢! - Thelonias
显示剩余3条评论

2
请尝试以下方法:
foreach(var custGroup in forecasts.Where(f => f.Year == DateTime.Now.Year).GroupBy(f => new { f.Customer, f.SalesPersonId }).Where(k => k.Count() > 1).Select(k => new { Customer = k.Key.Customer, SalesPersonId = k.Key.SalesPersonId, TotalAmount = k.Sum(x => x.Amount) } )
{
           toReturn.Add(new MultipleCustomer(custGroup.Customer)
           {
              Salesperson = custGroup.SalesPersonId,
              Forecast = custGroup.TotalAmount
           });
       }
   }
}

我一直在凭借自己的想象力写作。附近没有C#编译器,所以可能会有一些错误。

你遇到的问题的关键是需要聚合你的项目并求和它们的金额。


这只会给我每个预测,其中金额按客户/销售人员分组求和。 - Thelonias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接