2

I expect a very simple solution, but I can't for the life of me figure this out...

I am trying to create the LINQ equivalent of this:

SELECT Group, COUNT(*) as GroupCount
FROM table1
WHERE Valid > 0
GROUP BY Group, Project

I have this so far:

var model = _db.table1
    .Where(r => r.Valid > 0)
    .GroupBy(r => new { r.GROUP, r.Project})
    .Select(r => new{ r.GROUP, GroupCount = r.count()};

What is wrong with my query? Visual studio throws and error stating that:

System.Linq.IGrouping' does not contain a definition for 'GROUP' and no extension method 'GROUP' accepting a first argument of type 'System.Linq.IGrouping' could be found (are you missing a using directive or an assembly reference?)

EDIT: Just a note: The above error is given for r.Group in the Select clause.

It also throws an error stating that the count extension method doesn't exist, but I've seen other examples done this way. Maybe I was looking at an example from an old version of LINQ?

EDIT2: Some example data

GroupName    ProjectID    Step    Other Info...
-----------------------------------------------
GroupA     |     1      |   1   | ..............
GroupA     |     1      |   2   |..............
GroupA     |     3      |   1   | ..............
GroupB     |     4      |   1   | ..............
GroupB     |     5      |   1   | ..............
GroupC     |     6      |   1   |..............

Desired result:

 GroupName    Group Count
--------------------------- 
GroupA      |     2
GroupB      |     2
GroupC      |     1
4

3 回答 3

2

Well, you have following errors in the .Select statement:

  • .count should be .Count (C# is case sensitive)
  • r.GROUP should be r.Key or r.Key.GROUP (.GroupBy() returns an IGrouping<TKey, TElement>)
  • You forgot the last parenthesis in the Select method. (But maybe that was just a typo in the example)

Result:

var model = _db.table1
    .Where(r => r.Valid > 0)
    .GroupBy(r => new { r.GROUP, r.Project })
    .Select(r => new { r.Key.GROUP, GroupCount = r.Count() });

UPDATE:

After the comments and question update; it looks like you are only grouping by group, so that would turn in to something like this to yield the output you requested:

var model = _db.table1
    .Where(r => r.Valid > 0)
    .GroupBy(r => new { r.GROUP }) // First, group only on GROUP
    .Select(r => new 
    { 
        r.Key.GROUP, 
        // Second, group on unique ProjectId's
        GroupCount = r.GroupBy(g => g.Project).Count()
    });

Or simplified:

var model = _db.table1
    .Where(r => r.Valid > 0)
    .GroupBy(r => r.GROUP) // First, group only on GROUP
    .Select(r => new 
    { 
        Group = r.Key, 
        // Second, group on unique ProjectId's
        GroupCount = r.GroupBy(g => g.Project).Count() 
    });

As you asked in the comments, yes, you could say that the values are concatenated in the GroupBy clause. So new { r.GROUP, r.Project } would group all pairs with the same value.

于 2012-12-12T18:53:25.983 回答
1

LINQ queries are case-sensitive. You're trying to access r.GROUP, which probably doesn't exist. Use r.Group instead. Also change r.count() to r.Count(). Here's the corrected code:

var model = _db.table1
    .Where(r => r.Valid > 0)
    .GroupBy(r => new { r.Group, r.Project})
    .Select(r => new{ r.Key, GroupCount = r.Count()};
于 2012-12-12T18:44:34.623 回答
0

When you're doing the Group By, you're creating a new anonymous type (not of the type you think it is). Thus, when you're doing the select statement, it has no idea what the heck GROUP is.

To mitigate this, follow the 2nd answer located here.

于 2012-12-12T18:46:37.310 回答