如何在LINQ to SQL中计算表中的true数
本文关键字:计算 true SQL LINQ to | 更新日期: 2023-09-27 18:00:37
我有一个类似的表
StudID | 日期 | I | II | III | IV | V | VI | VII | VIII |
---|---|---|---|---|---|---|---|---|---|
100 | 2011年2月10日 | T | T | F | F | F | F | F | T |
101 | 2011年2月10日 | 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 |
正如注释所建议的,您应该规范化您的数据。
然而,如果你不能做到这一点,你只需要计算每行中的true数。
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实际上是字符而不是位/布尔值,那么您可以尝试
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,并记录返回真实的次数