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;}
}

年が今年である金額> 0を持つ「顧客」ごとに、すべての個別の「SalesID」のリストを表示する必要があります。

現在、顧客ごとにグループ化していますが、データセット内の同じ顧客と SalesID に対して複数の「金額」を持つことができるため、期待した結果が得られません。私の結果は次のとおりです。

  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;
4

2 に答える 2

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#コンパイラがないため、エラーが発生する可能性があります。

ここでの問題の鍵は、アイテムの金額を合計してアイテムを集計する必要があることです。

于 2012-11-20T22:07:40.123 に答える
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;
于 2012-11-20T21:43:47.123 に答える