简体   繁体   English

LINQ Lambda Group By Sum

[英]LINQ Lambda Group By with Sum

Hi I can do this in method syntax but I'm trying to improve my lambda skills how can I do: 嗨,我可以在方法语法中这样做,但我正在努力提高我的lambda技能我该怎么办:

SELECT SUM([job_group_quota]) as 'SUM'
FROM [dbo].[tbl_job_session]
WHERE [job_group_job_number] = @jobnum
and [job_group_ID] like @sess
GROUP BY [job_group_job_number]

I've been messing around with it but can't get it right. 我一直在搞乱它,但无法做到正确。

lnq.tbl_job_sessions.GroupBy(a => a.job_group_job_number == jnum)
                    .Select(b => new { b.job_group_quota}).Sum();

A general example: 一般例子:

query
.GroupBy(item => item.GroupKey)
.Select(group => group.Sum(item => item.Aggregate));

Few Group by Examples 几个小组的例子

public void GroupBy1() { var personList = dbEntities.People.GroupBy(m => m.PersonType).Select(m => new { PersonType = m.Key, Count = m.Count() }); public void GroupBy1(){var personList = dbEntities.People.GroupBy(m => m.PersonType).Select(m => new {PersonType = m.Key,Count = m.Count()}); } }

    public void GroupBy2()
    {
        var personList = dbEntities.People.GroupBy(m => new { m.PersonType, m.FirstName }).Select(m => new { PersonType = m.Key, Count = m.Count() });
    }

    public void GroupBy3()
    {
        var personList = dbEntities.People.Where(m => m.EmailPromotion != 0).GroupBy(m => new { m.PersonType, m.FirstName }).Select(m => new { PersonType = m.Key, Count = m.Count() });
    }

    public void GroupBy4()
    {
        var personList = dbEntities.People.GroupBy(m => new { m.PersonType, m.FirstName }).Where(m => m.Count() > 70).Select(m => new { PersonType = m.Key, Count = m.Count() });
    }

    public void GroupBy5()
    {
        var personList = dbEntities.People
            .GroupBy(m =>
                new
                {
                    m.PersonType
                }).Where(m => m.Count() > 70)
                    .Select(m =>
                        new
                        {
                            PersonType = m.Key,
                            Count = m.Count()
                        });

        var list1 = dbEntities.People.
            GroupBy(m => new { m.PersonType }).
            Select(m =>
                new
                {
                    Type = m.Key,
                    Count = m.Count()
                })
            .Where(
                   m => m.Count > 70
                && m.Type.PersonType.Equals("EM")
                || m.Type.PersonType.Equals("GC"));
    }

    public void GroupBy6()
    {
        var list1 = dbEntities.People.
            GroupBy(m => new { m.PersonType, m.EmailPromotion }).Select(m =>
                new
                {
                    Type = m.Key,
                    Count = m.Count()
                })
            .Where
            (
                m => m.Count > 70 && m.Type.EmailPromotion.Equals(0) &&
                (
                    m.Type.PersonType.Equals("EM") ||
                    m.Type.PersonType.Equals("GC")
                ));
    }

    public void GroupBy7()
    {
        var list1 = dbEntities.People.
            GroupBy(m => m.PersonType).
            Select(c =>
                new
                {
                    Type = c.Key,
                    Total = c.Sum(p => p.BusinessEntityID)
                });
    }

    public void GroupBy8()
    {
        var list1 = dbEntities.People.
            GroupBy(m => m.PersonType).
            Select(c =>
                new
                {
                    Type = c.Key,
                    Count = c.Count(),
                    Total = c.Sum(p => p.BusinessEntityID)
                });
    }

    public void GroupBy9()
    {
        var list1 = dbEntities.People.
            GroupBy(m => m.PersonType).
            Select(c =>
                new
                {
                    Type = c.Key,
                    Max = c.Max(),
                });
    }

This example shows how to iterate the grouped values getting the key and totals, and how to get totals directly (like previous). 此示例显示如何迭代获取键和总计的分组值,以及如何直接获取总计(如前所述)。 Both using only lambda operator. 两者都只使用lambda运算符。

using System;
using System.Collections.Generic;
using System.Linq;

public class Person
{
    public string Name { get; set; }
    public string City { get; set; }
    public string ZipCode { get; set; }
    public int SomeValue { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<Person> data = GetPopulatedData();

        var totals = data.GroupBy(x =>
            new { x.Name, x.City, x.ZipCode }).Select(y =>
                y.Sum(i => i.SomeValue));

        var groupsForIterate = data.GroupBy(x =>
            new { x.Name, x.City, x.ZipCode });

        Console.WriteLine("Totals: ");
        foreach (var total in totals)
        {
            Console.WriteLine(total);
        }

        Console.WriteLine("Categories: ");
        foreach (var categ in groupsForIterate)
        {
            // You can refer to one field like this: categ.Key.Ciduad
            Console.WriteLine("Group" + categ.Key);
            Console.WriteLine(categ.Sum(x => x.SomeValue));
        }

        //Output:
        //Totals:
        //1
        //2
        //1
        //Categories:
        //Group{ Name = Mark, City = BCN, ZipCode = 00000 }
        //1
        //Group{ Name = Mark, City = BCN, ZipCode = 000000 }
        //2
        //Group{ Name = John, City = NYC, ZipCode = 000000 }
        //1
    }

    private static List<Person> GetPopulatedData()
    {
        List<Person> datos = new List<Person>()
        {
            new Person(){Name="Mark", City = "BCN",
                ZipCode = "00000", SomeValue = 1}, // group A

            new Person(){Name="Mark", City = "BCN",
                ZipCode = "000000", SomeValue = 1}, // group B

            new Person(){Name="Mark", City = "BCN",
                ZipCode = "000000", SomeValue = 1}, // group B

            new Person(){Name="John", City = "NYC",
                ZipCode = "000000", SomeValue = 1}, // group C
        };
        return datos;
    }
}

If you want to get a key-to-sum Dictionary result. 如果你想获得一个键到词的结果。

var allJobQuota = jobSessions.GroupBy(s => s.jobNumber)
                             .ToDictionary(g => g.Key, g => g.Sum(s => s.quota));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM