c# - Linq 中的多个聚合级别

标签 c# linq

我不确定我的问题应该被称为什么,尽管我在主题中提到“多个聚合级别”。

我想聚合所提供数据的不同维度。在此示例中,我尝试通过 SalesCode 获取聚合数据,并通过 AccountId 获取详细聚合数据。所以基本上,我可以获得与销售聚合级别关联的帐户。

因此我应该得到的输出应该是这样的:

enter image description here

我的要求是将数据映射到以下类:

public class Earning
{
    public string EntityId
    {
        get;
        set;
    }

    public string EntityName
    {
        get;
        set;
    }

    public string EntityType
    {
        get;
        set;
    }

    public int TradeCount
    {
        get;
        set;
    }

    public int OrderCount
    {
        get;
        set;
    }

    public decimal PrincipalAmount
    {
        get;
        set;
    }

    public decimal GrossBrokerage
    {
        get;
        set;
    }

    public decimal NetBrokerage
    {
        get;
        set;
    }

    public List<Earning> Detail
    {
        get;
        set;
    }
}

来自以下数据:

List<Trade> Trades = new List<Trade>(){ 
            new Trade{
                AccountId = "ACT01", 
                SalesCode = "STEVES", 
                PrincipalAmount = 100, 
                GrossBrokerage = 0.64M,
                NetBrokerage = 0.64M
            }, 
            new Trade{
                AccountId = "ACT02", 
                SalesCode = "STEVES", 
                PrincipalAmount = 100, 
                GrossBrokerage = 0.64M,
                NetBrokerage = 0.64M
            }, 
            new Trade{
                AccountId = "ACT01", 
                SalesCode = "STEVES", 
                PrincipalAmount = 50, 
                GrossBrokerage = 0.32M,
                NetBrokerage = 0.32M
            }, 
            new Trade{
                AccountId = "ACT03", 
                SalesCode = "GRAHAMS", 
                PrincipalAmount = 100, 
                GrossBrokerage = 0.64M,
                NetBrokerage = 0.64M
            }, 
        };

到目前为止,我在下面提到的工作中尝试了以下方法,但我对获得第二级聚合(通过 AccountId)一无所知。

DotNetFiddle:https://dotnetfiddle.net/SxGdDD

贸易类如下所示:

public class Trade
{
    public string AccountId
    {
        get;
        set;
    }

    public string SalesCode
    {
        get;
        set;
    }

    public decimal PrincipalAmount
    {
        get;
        set;
    }

    public decimal GrossBrokerage
    {
        get;
        set;
    }

    public decimal NetBrokerage
    {
        get;
        set;
    }
}

最佳答案

您需要另一个GroupBy

    var results = (
        from r in Trades
        group r by r.SalesCode
        into g
        select new Earning()
        {
            EntityId = g.Key.ToString(),
            EntityName = g.Key.ToString(),
            TradeCount = g.Count(),
            OrderCount = g.Count(),
            PrincipalAmount = g.Sum(c => c.PrincipalAmount),
            GrossBrokerage = g.Sum(c => c.GrossBrokerage),
            NetBrokerage = g.Sum(c => c.NetBrokerage),
            Detail = g.GroupBy(c=>c.AccountId).Select(c => new Earning()
       // Added GroupBy ---^^
            {
                EntityId = c.Key,
                EntityName = c.Key,
                TradeCount = c.Count(),
                OrderCount = c.Count(),
                PrincipalAmount = c.Sum(p=>p.PrincipalAmount),
                GrossBrokerage =  c.Sum(p=>p.GrossBrokerage),
                NetBrokerage = c.Sum(p=>p.NetBrokerage),

            }).ToList(),
        }).ToList();

    foreach (var item in results)
    {
        Console.WriteLine(item.EntityId);
        Console.WriteLine(string.Format("Total Principal Amount: {0}", item.PrincipalAmount.ToString()));
        Console.WriteLine(string.Format("Total Gross Brokerage Amount: {0}", item.GrossBrokerage.ToString()));
        Console.WriteLine(string.Format("Total Net Brokerage Amount: {0}", item.NetBrokerage.ToString()));

        foreach (Earning detail in item.Detail)
        {
            Console.WriteLine(string.Format("-- Detail {0}/{1}", detail.EntityId, detail.EntityName));
        }
    }

关于c# - Linq 中的多个聚合级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55038566/

相关文章:

c# - 如何通过 GPS 检查距 x,y 位置 10 米的半径

javascript - 为 Chart.js 图表提供服务器端数据

c# - 如何修复此 ArrayIndex 错误?

c# - Dynamics CRM 2011 - LINQ - 检索客户和联系人之间的连接

c# - 如何将 where 子句附加到 Entity Framework ObjectSet

c# - 在 WCF 服务 C# 中使用静态上下文、ConcurrencyMode.Single、InstanceContextMode.PerSession 有负面影响吗?

c# - 从接口(interface)继承的类中的列表 - 从类中添加到列表?

c# - 将数据写入数据库不起作用

Linq 将整数子列表与整数列表相交

linq - NHibernate LINQ 在 Where() 子句中支持 ToLower() 吗?