Как посчитать количество истин в таблице в LINQ to SQL - PullRequest
4 голосов
/ 29 июня 2011

У меня есть такая таблица

 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

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

есть идеи?

Ответы [ 5 ]

7 голосов
/ 29 июня 2011

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

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

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));
2 голосов
/ 29 июня 2011
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;
}
1 голос
/ 29 июня 2011

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

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', '')))
1 голос
/ 29 июня 2011
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()
0 голосов
/ 29 июня 2011

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

...