带计数的Linq查询(扩展方法)

时间:2012-12-12 18:39:34

标签: asp.net-mvc linq

我期待一个非常简单的解决方案,但我不能为我的生活想出这个......

我正在尝试创建与此类似的LINQ:

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

到目前为止,我有这个:

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

我的查询有什么问题? Visual Studio抛出并错误地说明:

  

System.Linq.IGrouping'不包含'GROUP'的定义,并且没有扩展方法'GROUP'可以找到接受类型'System.Linq.IGrouping'的第一个参数(你是否缺少using指令或者装配参考?)

编辑:请注意:r.Group条款中Select给出了上述错误。

它还会抛出一个错误,指出count扩展方法不存在,但我已经看到了其他这样做的例子。也许我正在查看旧版LINQ的示例?

EDIT2:一些示例数据

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

期望的结果:

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

3 个答案:

答案 0 :(得分:2)

嗯,您在.Select声明中有以下错误:

  • .count应为.Count(C#区分大小写)
  • r.GROUP应为r.Keyr.Key.GROUP(。GroupBy()返回IGrouping<TKey, TElement>
  • 您忘记了Select方法中的最后一个括号。 (但也许这只是示例中的一个错字)

结果:

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() });

<强>更新

评论和问题更新后;看起来你只是按组进行分组,所以这会变成这样的东西来产生你要求的输出:

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()
    });

或简化:

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() 
    });

正如您在评论中所说,是的,您可以说这些值在GroupBy子句中连接在一起。因此new { r.GROUP, r.Project }会将所有货币对分组相同的值。

答案 1 :(得分:1)

LINQ查询区分大小写。您正在尝试访问可能不存在的r.GROUP。请改用r.Group。同时将r.count()更改为r.Count()。这是更正后的代码:

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

答案 2 :(得分:0)

当您进行Group By时,您正在创建一个新的匿名类型(不是您认为的类型)。因此,当您执行select语句时,它不知道GROUP是什么。

要缓解此问题,请按照第二个回答located here