2014-01-10 31 views
0

我遇到麻煩linq語句以我需要的方式提供數據我的觀點。Linq聲明有條件地包括或排除然後計數結果

這是我的數據有:

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

我需要能夠有一個統計1和0的數據集,但在上面的例子所以忽略99,艾莉森有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) 

我會很感激的任何指導,

謝謝,馬克

+0

的答案已經告訴你什麼是錯誤的,我只想補充一下:在這種情況下,你應該問自己在你的Linq-Query中代表什麼'x'。如果你清楚這一點,大多數問題都可以解決;) – germi

回答

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

謝謝 - 只要SO允許(10分鐘左右),我就會馬上回答 - 謝謝Felipe和Sharooz。 – Mark

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() 
    }) 
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方法,以避免混淆代碼。

+0

對變量進行重命名以確保代碼和程序員不會感到混淆。 – Chris

1

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

做它周圍的其他方法:Where().Count(),或只使用Count()與括號之間的條件(這相當於先調用Where,然後做一個Count)。

1

你的計數在這裏錯位。它應該在where子句之後。

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

應該

Correct= x.Where(x => x.questions ==1).Count(), 
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的()的結果是整數,它does'n有 '問題' 財產