Count()
can take a predicate (Expression<Func<T, bool>>
) as argument, so I think you may just do
var xx2 = xx1.Select(b => new
{
testID= b.Key.testID,
failed = b.Count(x => x.Grade < 80),
passed = b.Count(x => x.Grade >=80),
taken = b.Count()
})
.Select(b => new {
testID = b.TestID,
failed = b.failed,
passed = b.passed,
taken = b.taken,
passingrate = b.taken == 0 ? 0.0 : ((float)b.passed / b.taken) * 100
}).ToList();
The query syntax has the (usefull in this case) let
keyword, so it might be easier to read
var xx2 = from b in xx1
let failed = b.Count(x => x.Grade < 80)
let passed = b.Count(x => x.Grade >= 80)
let taken = failed + passed
select new {
testID = b.Key.TextID,
failed = failed,
passed = passed,
taken = taken,
passingrate = taken == 0 ? 0.0 : ((float)passed / taken) * 100
}