2010-09-06 20 views
0

J'ai la LINQ suivante conditionnelle lorsque la requête de clause qui produit un résultat de poids:Les fonctions d'agrégation dans LINQ

De là, je voudrais prendre le jeu de résultats et rejoindre sur une autre table, tblPurchases

var result = weights.Join(getsuppliersproducts.tblPurchases, 
    w => new { w.MemberId, w.MemberName, w.LocationId, w.UnitId }, 
    p => new { p.MemberId, p.MemberName, p.LocationId, p.UnitId }, 
    (w, p) => p); 

Dans cette deuxième table, j'ai deux colonnes sur lesquelles j'aimerais effectuer une fonction aggreagte, une somme sur PurchaseQuantity et un nombre d'UnitID.

Ainsi, dans son format brut, tblPurchases ressembleraient donc:

MemberID LocationID UnitId SupplierID SupplierStatus Purchases 
1   1   ab  Sup1   Live   10 
1   1   abc  Sup1   Live   10 
1   1   abcd  Sup2   Dead   50 

de mes résultats ensemble de données, je voudrais la sortie pour ressembler à ceci:

MemberID LocationID SupplierID SupplierStatus UnitIdCount Total Purchases 
1   1   Sup1  Live   2    50 

En outre, avec ces amendements, puis-je toujours retourner ceci à une liste?

Comment l'implémenter avec LINQ? J'ai essayé, et échoué lamentablement.

(Pour ceux qui ont vu mes messages précédents, je suis en train de couvrir tous les angles afin que je puisse bien comprendre le concept de ce qui se passe dans SQL et LINQ)

+0

Qu'est-ce que la clause conditionnelle conditionnelle a à voir avec la question réelle? – Steven

+0

Rien en tant que tel, juste illustrant comment je suis venu à l'objet «poids». –

+0

Veuillez supprimer cette information, car elle encombre la question. – Steven

Répondre

1

Cette requête renverra un IEnumerable où chacun des achats correspond à MemberId, MemberName, LocationId et UnitId dans la requête Weights d'origine. Vous pouvez facilement faire un agrégat à la fois, donc

var result = weights.Join(getsuppliersproducts.tblPurchases, 
    w => new { w.MemberId, w.MemberName, w.LocationId, w.UnitId }, 
    p => new { p.MemberId, p.MemberName, p.LocationId, p.UnitId }, 
    (w, p) => p).ToList(); 

Int32 count = result.Count(); 
Double quantity = result.Sum(p => p.PurchaseQuantity); 

Est-ce ce que vous essayez de faire?

EDIT, après votre réponse de Je voudrais réétablir une liste de tblPurchases avec deux nouvelles colonnes, la somme de la quantité d'achat et le nombre d'unités d'ID.

Cela donne une sortie à plat:

var query = Weights.GroupJoin(
    Purchases, 
    w => new {w.MemberId, w.LocationId}, 
    p => new {p.MemberId, p.LocationId}, 
    (w,p) => new {w.MemberId, w.LocationId, Count = p.Count(), Sum = p.Sum(x => x.Purchases)}); 

Notez que au point où nous faisons le (w, p) => nouveau {} que w est un poids et p est une liste de correspondance des achats ce poids, de sorte que vous pouvez toujours conserver toutes les données (hiérarchiques):

var query = Weights.GroupJoin(
    Purchases, 
    w => new {w.MemberId, w.LocationId}, 
    p => new {p.MemberId, p.LocationId}, 
    (w,p) => new {w.MemberId, w.LocationId, Count = p.Count(), Sum = p.Sum(x => x.Purchases), Purchases = p}); 
+0

Bonjour Amaca - Je voudrais réinscrire une liste de tblPurchases avec deux nouvelles colonnes, la somme de la quantité d'achat et du nombre d'unités. –

+0

C'est génial - merci Amaca qui m'a vraiment aidé à comprendre. –