Linq声明有条件地包括或排除然后计数结果

时间:2014-01-10 10:16:42

标签: c# asp.net-mvc linq

我在使用linq语句时遇到问题,无法以我的视图需要的方式提供数据。

这是我的数据:

AgentName   questions
Alison          1
Alison          1
Alison          0
Jack            0
Jack            99
Jack            1

我需要能够拥有一个计数为1和0的数据集,但忽略99.所以在上面的例子中,Alison有2个问题(1)正确,1个问题(0)错误。杰克有一个问题是正确的(1),一个是错的(0),一个不算(99)。结果数据为:

AgentName   questions Correct    Question Wrong
Alison          2                  1
Jack            1                  1

我尝试的是:

   var results = qas.GroupBy(x => x.AgentName)
    .Select(x => new
    {
        AnalystId = x.Key,
        Analyst = x.FirstOrDefault().Analyst.AgentName,
        Correct= x.Count().Where(x => x.questions ==1),
        Wrong= x.Count().Where(x => x.questions ==0)
    })

......但它失败了:

Correct= x.Count().Where(x => x.questions ==1),
Wrong= x.Count().Where(x => x.questions ==0)

我很感激任何指导,

谢谢,Mark

6 个答案:

答案 0 :(得分:5)

Count方法返回一个整数值,因此,您不能从整数中加入Where扩展方法。尝试直接使用带有重载的Count方法,您可以传递条件来执行它,对于示例:

   var results = qas.GroupBy(x => x.AgentName)
    .Select(x => new
    {
        AnalystId = x.Key,
        Analyst = x.FirstOrDefault().Analyst.AgentName,
        Correct= x.Count(k => k.questions == 1),
        Wrong= x.Count(k => k.questions == 0)
    });

并在Count方法中重命名表达式的变量,以避免混淆代码。

答案 1 :(得分:2)

应该是这样的

 var results = qas.GroupBy(x => x.AgentName)
    .Select(x => new
    {
        AnalystId = x.Key,
        Analyst = x.FirstOrDefault().Analyst.AgentName,
        Correct= x.Where(x => x.questions ==1).Count(),
        Wrong= x.Where(x => x.questions ==0).Count()
    })

答案 2 :(得分:2)

使用:

 var results = qas.GroupBy(x => x.AgentName)
    .Select(x => new
    {
        AnalystId = x.Key,
        Analyst = x.FirstOrDefault().Analyst.AgentName,
        Correct= x.Where(x => x.questions ==1).Count(),
        Wrong= x.Where(x => x.questions ==0).Count()
    })

答案 3 :(得分:1)

LINQ不是SQL。您无法使用Count().Where()

反之亦然:Where().Count(),或者只是在括号之间使用Count()(这相当于首先调用Where然后执行Count })。

答案 4 :(得分:1)

你的点数在这里是错位的。它应该在where子句之后。

Correct= x.Count().Where(x => x.questions ==1),

应该是

Correct= x.Where(x => x.questions ==1).Count(),

答案 5 :(得分:0)

试试这个

var results = qas.GroupBy(x => x.AgentName)
.Select(x => new
{
    AnalystId = x.Key,
    Analyst = x.FirstOrDefault().Analyst.AgentName,
    Correct= x.Where(x => x.questions ==1).Count(),
    Wrong= x.Where(x => x.questions ==0).Count()
})

x.Count()的结果是整数,它没有'问题'属性