web-dev-qa-db-fra.com

comment grouper par plusieurs colonnes en utilisant linq

J'ai une table de base de données avec un ensemble de données qui contient plusieurs lignes de données comme suit

ItemId               Code                             StatusId
-------------------- ---------------------------------------------
62224                NC0860000                             8
62225                NC0860000                             8
62226                NC0860000                             8
62227                NC0860200                             5
62228                NC0860000                             5
62229                NC0860000                             5
62230                NC0860000                             5

Ce que je voudrais accomplir, c'est un résultat de sortie

NC0860000  8  3  (code, status, count)
NC0860000  5  3

Je ne comprends pas bien comment fonctionne le regroupement dans EF. Je peux obtenir la clé et le nombre d'un seul groupe en utilisant une requête comme:

var results = (from ssi in ctx.StageSubmitItems
                           join s in ctx.StageSubmissions on ssi.SubmissionId equals s.SubmissionId
                           where s.ContributorCode == contributorId
                           group ssi.SubmitItemId by ssi.AgencyCode into g
                           select new {AgencyCode = g.Key, Count = g.Count() }).ToList();

Mais je ne peux pas comprendre comment grouper par code, puis par StatusId, puis produire un décompte du nombre total de lignes par statut.

J'apprécierais toutes les suggestions sur où chercher comment accomplir cela ou ce que je fais incorrectement dans la requête.

14
rlcrews

Vous pouvez regrouper par une nouvelle classe anon comme suit:

// I created a Foo class to show this working
var fooList = new List<Foo> {
    new Foo { ItemId = 62224, Code = "NC0860000", StatusId = 8 },
    new Foo { ItemId = 62225, Code = "NC0860000", StatusId = 8 },
    new Foo { ItemId = 62226, Code = "NC0860000", StatusId = 8 },
    new Foo { ItemId = 62227, Code = "NC0860200", StatusId = 5 },
    new Foo { ItemId = 62228, Code = "NC0860000", StatusId = 5 },
    new Foo { ItemId = 62229, Code = "NC0860000", StatusId = 5 },
    new Foo { ItemId = 62230, Code = "NC0860000", StatusId = 5 },
};

var results = (from ssi in fooList
    // here I choose each field I want to group by
    group ssi by new { ssi.Code, ssi.StatusId } into g
    select new { AgencyCode = g.Key.Code, Status = g.Key.StatusId, Count = g.Count() }
).ToList();

// LINQPad output command
results.Dump();

Avec les données fournies, voici la sortie:

AgencyCode Status Count
NC0860000  8      3 
NC0860200  5      1 
NC0860000  5      3 

Je suppose que "NC0860200" est une erreur, mais il se trouve dans vos exemples de données, donc je l'ai inclus.

36
Timothy Walters