Casey Crookston
Casey Crookston

Reputation: 13965

IGrouping does not contain a definition for

I've been looking at other threads here to learn how to do a GroupBy in linq. I am following the EXACT syntax that has worked for others, but, it's not working.

Here's the query:

var results = from p in pending
              group p by p.ContactID into g
              let amount = g.Sum(s => s.Amount)
              select new PaymentItemModel
              {
                  ContactID = g.ContactID, // <--- Error here
                  Amount = amount
              };

pending is a List<T> that contains, among other columns, ContactID and Amount, but those are the only two I care about for this query.

The trouble is, inside the the select new, the g. won't give me any of the columns inside the original list, pending. And when I try, I get:

IGrouping <int, LeadPurchases> does not contain a definition for ContactID, and no extension method blah blah blah...

This is the SQL I am trying to emulate:

SELECT 
    lp.PurchasedFromContactID, 
    SUM (lp.Amount) 
FROM 
    LeadPurchases lp
GROUP BY 
    lp.PurchasedFromContactID

Upvotes: 4

Views: 7913

Answers (1)

sujith karivelil
sujith karivelil

Reputation: 29036

You are grouping on the basis of ContactID, so it should be the Key for the result, So you have to use g.Key instead of g.ContactID; Which means the query should be like the following:

from p in pending
group p by p.ContactID into g
let amount = g.Sum(s => s.Amount)
select new PaymentItemModel
       {
           ContactID = g.Key,
           Amount = amount
       };

updates :

If you want to perform grouping based on more than one column then the GroupBy clause will be like this:

group p by new
{
    p.ContactID,
    p.Field2,
    p.Field3
}into g
select new PaymentItemModel()
{
    ContactID = g.Key.ContactID,
    anotherField = g.Key.Field2,
    nextField = g.Key.Field3       
};

Upvotes: 12

Related Questions