如何计算LINQ to SQL中表中的trues数

时间:2011-06-29 17:29:42

标签: c# asp.net 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的数量,即特鲁斯 StudID是varchar字段 日期是日期时间字段 以及位

的所有其他数据类型

任何想法?

5 个答案:

答案 0 :(得分:7)

正如评论所示,您应该将数据标准化。

但是如果你不能这样做,你只需要计算每一行中的真实数量。

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

编辑:要根据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));

答案 1 :(得分:2)

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;
}

答案 2 :(得分:1)

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()

答案 3 :(得分:1)

如果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', '')))

答案 4 :(得分:0)

构建一个名为bool CheckBit(StudID,Date,num)的函数,在其中传入StudID,Date和1到8之间的数字。将函数调用放入循环并传入1 - 8并保持计算你返回真实的次数