2010-08-26 6 views
2

J'ai une requête de jointure assez compliquée que j'utilise avec ma base de données. En l'exécutant, je finis avec des résultats qui contiennent un baseID et un tas d'autres champs. Je veux donc profiter de cette baseID et de déterminer combien de fois il se produit dans un tableau comme celui-ci:C# Linq eqiuvalent de SQL Count()

TableToBeCounted (Many to Many) 
{ 
    baseID, 
    childID 
} 

Comment puis-je effectuer une requête LINQ qui utilise encore la requête que je l'ai déjà et rejoint ensuite le nombre() avec l'ID de base?

Quelque chose comme cela dans le code LINQ non testé:

from k in db.Kingdom 
join p in db.Phylum on k.KingdomID equals p.KingdomID 
where p.PhylumID == "Something" 
join c in db.Class on p.PhylumID equals c.PhylumID 
select new {c.ClassID, c.Name}; 

Je veux donc prendre ce code et compter le nombre de commandes sont imbriquées au sein de chaque classe. Je veux ensuite ajouter une colonne à l'aide LINQ pour que mes regards de sélection finale comme ceci:

select new {c.ClassID, c.Name, o.Count()}//Or something like that. 

L'exemple entier est basé sur le système Biological Classification.

Mise à jour:

On suppose pour l'exemple que j'ai plusieurs tables:

Kingdom 
|--Phylum 
    |--Class 
     |--Order 

Chaque Embranchement a un ID Phylum et un royaume ID. Ce qui signifie que tous les phylum sont un sous-ensemble d'un royaume. Toutes les commandes sont des sous-ensembles d'un ID de classe. Je veux compter combien d'ordres ci-dessous pour chaque classe.

J'espère que c'est clair maintenant.

+1

Où avez l'Ordre 'O' viennent de votre requête ? Vous n'avez rien mentionné d'où ça vient ou à quoi ça ressemble. –

+0

L'ordre o, est juste le groupe hiérarchique suivant ci-dessous classe. Vous pouvez supposer qu'il y a 'from o dans db.Order 'où order est l'enfantID et Class est l'ID baseID. – Rick

Répondre

1

Normalement, cela est fait avec un groupe. Par exemple:

from k in db.Kingdom 
join p in db.Phylum on k.KingdomID equals p.KingdomID 
where p.PhylumID == "Something" 
join c in db.Class on p.PhylumID equals c.PhylumID 
group c by new { c.ClassID, c.Name } into g 
select new { Count = g.Count(), g.Key.ClassID, g.Key.Name }; 

Cela comptera fondamentalement combien d'entrées vous avez pour chaque paire ClassID/Name. Cependant, comme le dit Winston dans les commentaires, vous êtes peut-être intéressé par une autre table (Order) dont vous ne nous avez pas parlé. Nous ne pouvons pas vraiment donner plus d'informations tant que nous ne savons pas ce que vous faites ici. Avez-vous déjà une relation établie pour cela dans LINQ to SQL? S'il vous plaît, parlez-nous de la table Order et de la manière dont elle est liée à vos autres tables.

EDIT: D'accord, avec la question modifiée, je soupçonne que nous pouvons complètement ignorer le phylum et le royaume, à moins que je ne manque quelque chose. (Je vois peux pas comment cela se rapporte à un grand nombre à plusieurs ... mapping)

Je pense que cela fonctionnerait:

from o in db.Order 
group o by o.ClassID into g 
join c in db.Class on g.Key.ClassID equals c.ClassID 
select new { c.ClassID, c.Name, g.Count() }; 
+0

Il veut compter les commandes par classe. De ce que je peux voir, nous pouvons omettre Kingdom car il n'est pas utilisé, et inclure une jointure sur order.ClassId = c.ClassId –

+0

@Winston: Kingdom est utilisé en ce qu'il va rejeter toute entrée p sans une entrée Kingdom correspondant, mais d'autres que cela, je suis d'accord. Éditera. –

+0

dans le système de classification biologique Je pense que tous les Phylums sont garantis d'être dans un Royaume. Si les données sont valides, nous pouvons probablement omettre. –