Group by with multiple columns using lambda

后端 未结 5 809
一个人的身影
一个人的身影 2020-12-02 16:09

How can I group by with multiple columns using lambda?

I saw examples of how to do it using linq to entities, but I am looking for lambda form.

相关标签:
5条回答
  • 2020-12-02 16:46
    var query = source.GroupBy(x => new { x.Column1, x.Column2 });
    
    0 讨论(0)
  • 2020-12-02 16:56

    Further to aduchis answer above - if you then need to filter based on those group by keys, you can define a class to wrap the many keys.

    return customers.GroupBy(a => new CustomerGroupingKey(a.Country, a.Gender))
                    .Where(a => a.Key.Country == "Ireland" && a.Key.Gender == "M")
                    .SelectMany(a => a)
                    .ToList();
    

    Where CustomerGroupingKey takes the group keys:

        private class CustomerGroupingKey
        {
            public CustomerGroupingKey(string country, string gender)
            {
                Country = country;
                Gender = gender;
            }
    
            public string Country { get; }
    
            public string Gender { get; }
        }
    
    0 讨论(0)
  • 2020-12-02 16:58

    I came up with a mix of defining a class like David's answer, but not requiring a Where class to go with it. It looks something like:

    var resultsGroupings = resultsRecords.GroupBy(r => new { r.IdObj1, r.IdObj2, r.IdObj3})
                                        .Select(r => new ResultGrouping {
                                            IdObj1= r.Key.IdObj1,
                                            IdObj2= r.Key.IdObj2,
                                            IdObj3= r.Key.IdObj3,
                                            Results = r.ToArray(),
                                            Count = r.Count()
                                        });
    
    
    
    private class ResultGrouping
            {
                public short IdObj1{ get; set; }
                public short IdObj2{ get; set; }
                public int IdObj3{ get; set; }
    
                public ResultCsvImport[] Results { get; set; }
                public int Count { get; set; }
            }
    

    Where resultRecords is my initial list I'm grouping, and its a List<ResultCsvImport>. Note that the idea here to is that, I'm grouping by 3 columns, IdObj1 and IdObj2 and IdObj3

    0 讨论(0)
  • 2020-12-02 16:59

    if your table is like this

    rowId     col1    col2    col3    col4
     1          a       e       12       2
     2          b       f       42       5
     3          a       e       32       2
     4          b       f       44       5
    
    
    var grouped = myTable.AsEnumerable().GroupBy(r=> new {pp1 =  r.Field<int>("col1"), pp2 = r.Field<int>("col2")});
    
    0 讨论(0)
  • 2020-12-02 17:03
         class Element
            {
                public string Company;        
                public string TypeOfInvestment;
                public decimal Worth;
            }
    
       class Program
        {
            static void Main(string[] args)
            {
             List<Element> elements = new List<Element>()
                {
                    new Element { Company = "JPMORGAN CHASE",TypeOfInvestment = "Stocks", Worth = 96983 },
                    new Element { Company = "AMER TOWER CORP",TypeOfInvestment = "Securities", Worth = 17141 },
                    new Element { Company = "ORACLE CORP",TypeOfInvestment = "Assets", Worth = 59372 },
                    new Element { Company = "PEPSICO INC",TypeOfInvestment = "Assets", Worth = 26516 },
                    new Element { Company = "PROCTER & GAMBL",TypeOfInvestment = "Stocks", Worth = 387050 },
                    new Element { Company = "QUASLCOMM INC",TypeOfInvestment = "Bonds", Worth = 196811 },
                    new Element { Company = "UTD TECHS CORP",TypeOfInvestment = "Bonds", Worth = 257429 },
                    new Element { Company = "WELLS FARGO-NEW",TypeOfInvestment = "Bank Account", Worth = 106600 },
                    new Element { Company = "FEDEX CORP",TypeOfInvestment = "Stocks", Worth = 103955 },
                    new Element { Company = "CVS CAREMARK CP",TypeOfInvestment = "Securities", Worth = 171048 },
                };
    
                //Group by on multiple column in LINQ (Query Method)
                var query = from e in elements
                            group e by new{e.TypeOfInvestment,e.Company} into eg
                            select new {eg.Key.TypeOfInvestment, eg.Key.Company, Points = eg.Sum(rl => rl.Worth)};
    
    
    
                foreach (var item in query)
                {
                    Console.WriteLine(item.TypeOfInvestment.PadRight(20) + " " + item.Points.ToString());
                }
    
    
                //Group by on multiple column in LINQ (Lambda Method)
                var CompanyDetails =elements.GroupBy(s => new { s.Company, s.TypeOfInvestment})
                                   .Select(g =>
                                                new
                                                {
                                                    company = g.Key.Company,
                                                    TypeOfInvestment = g.Key.TypeOfInvestment,            
                                                    Balance = g.Sum(x => Math.Round(Convert.ToDecimal(x.Worth), 2)),
                                                }
                                          );
                foreach (var item in CompanyDetails)
                {
                    Console.WriteLine(item.TypeOfInvestment.PadRight(20) + " " + item.Balance.ToString());
                }
                Console.ReadLine();
    
            }
        }
    
    0 讨论(0)
提交回复
热议问题