Как подсчитать количество истин в таблице в LINQ to SQL

У меня есть таблица вроде этого

StudID Date I II III IV V VI VII VIII 
-------------------------------------------------------------- 
 100 2-10-11 T T F F F F F T
 101 2-10-11 T T T F F F F T
 100 3-10-11 T F F F F F F T
 100 4-10-11 T F F F F F F T

Теперь мне нужно получить количество T i.e, Trues в таблице для конкретного учащегося в конкретный месяц StudID - это поле varchar Дата - это поле даты и весь другой тип данных с битом

любые идеи?

5 ответов

Как следует из комментариев, вы должны нормализовать свои данные.

Однако, если вы не можете этого сделать, вам просто нужно подсчитать количество истин в каждой строке.

context.Studs.Sum(s => (s.I ? 1 : 0) + (s.II ? 1 : 0) + ... + (s.VIII ? 1 : 0));

edit: Чтобы ограничить сумму на основе StudID и месяца, вы должны использовать оператор Where

var id = "100";
var month = 10;
var set = context.Studs.Where(s => s.StudID == id;
set = set.Where(s => s.Date.Month == month);
return set.Sum(s => (s.I ? 1 : 0) + (s.II ? 1 : 0) + ... + (s.VIII ? 1 : 0));


var numberOfTrues = context.Students.
Where(x => x.StudID == 123 && x.Date.Month == studentMonth).
Sum(x => x.I.ToInt() + x.II.ToInt() + ... + x.VIII.ToInt());
// Add extension method 
public static int ToInt(this bool value)
{
 return value ? 1 : 0;
}


Если T и F на самом деле являются символами, а не бит /booleans, вы можете попробовать

context.Studs.Sum(s => (s.I+s.II+s.III+s.IV).Count(c => c=='T') );

но мне интересно, как выглядит сгенерированный SQL. Проще всего не что-то вроде

SELECT SUM(LEN(REPLACE(I+II+III+IV, 'F', '')))


var student = context.Students.Where(s => s.StudID == id && s.Date.Month == month).Single();
var trues = from results in student.GetType().GetProperties().Where(p => p.PropertyType == typeof(bool))
 let val = (bool)f.GetValue(student, null)
 where val
 select val;
// You can now check trues.Count()


Создайте функцию, называемую bool CheckBit (StudID, Date, num), где вы передаете в StudID, Date и число от 1 до 8. Поместите вызов функции в цикл и перейдите в 1 - 8 и сохраните сколько раз вы возвращаете истину

licensed under cc by-sa 3.0 with attribution.