2012-12-12 61 views
1

我期待有一个非常简单的解决方案,但我不能为我的生活想出解决办法...与计数(扩展方法)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”不包含定义‘集团’,没有扩展方法‘集团’接受一个类型的第一个参数‘System.Linq.IGrouping’可能找到(是否缺少using指令或程序集引用?)

编辑:只是一个注:Select子句中给出了r.Group上述错误。

它也会抛出一个错误,指出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 
+0

'.count'应该是'.Count()',它区分大小写... –

+0

DOH!这个问题是固定的。谢谢 – Jeff

+1

你可能想选择组中的键:'.Select(r => new {r.GROUP,GroupCount = r.count()};'应该是'.Select(r => new {r。 Key,GroupCount = r.Count()};' –

回答

2

嗯,你已经在.Select声明以下错误:

  • .count应该.Count(C#是区分大小写)
  • r.GROUPr.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() }); 

UPDATE:

的意见和问题,更新后;它看起来像你只按组进行分组,这样就会在转向这样的事情,获得​​您所需的输出:

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 }会将所有对组合在一起。

+0

这可行,但似乎产生意想不到的结果。我的意图是收集分配给每个唯一'Group'的唯一'Project'的数量。我的'GroupCount'每行最终为1。我想知道它是否与'r.Key.Group'有关... 编辑:看起来我应该使用'r.Project.Count()'或'r.Key,Project.Count()'。 – Jeff

+0

@Jeff我用一些模拟数据进行了测试,它适用于我,但也许我误解了你。你能举一个你有数据和输出应该是什么的例子吗? –

+0

我在问题中添加了示例数据。 – Jeff

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

不回答他的其他错误 – IronMan84

+0

@ IronMan84不是吗?你是指哪一个?我想如果他用'r.Group'替换了对'r.GROUP'的引用,就像我一样在我的例子中,它可能会解决OP的问题 –

+0

他的组错误并不是因为区分大小写,这是因为他需要t o使用r.Key。 – IronMan84

0

当你在做GROUP BY,你要创建一个新的匿名类型(不是你认为它是类型)。因此,当你执行select语句时,它不知道什么是GROUP。

要解决这个问题,请按照第二个答案located here