asp.net 如何在LINQ to SQL中计算表中True的个数

luaexgnf  于 2023-03-20  发布在  .NET
关注(0)|答案(5)|浏览(140)

我有一张这样的table
| 研究ID|日期|我|第二章|第三章|第四章|五|第六章|第七章|第八章|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 一百|2011年2月10日|T型|T型|F级|F级|F级|F级|F级|T型|
| 一百零一|2011年2月10日|T型|T型|T型|F级|F级|F级|F级|T型|
| 一百|2011年3月10日|T型|F级|F级|F级|F级|F级|F级|T型|
| 一百|2011年4月10日|T型|F级|F级|F级|F级|F级|F级|T型|
现在,我需要获取T的数量,即,表中某个学生在某个月的True值StudID是varchar字段Date是datetime字段,所有其他数据类型都是bit
有什么想法吗?

cnwbcb6i

cnwbcb6i1#

正如注解所建议的,您应该规范化您的数据。
然而,如果你无法做到这一点,你只需要计算每一行中真值的数量。

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));
idfiyjo8

idfiyjo82#

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

kiz8lqtg3#

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

3npbholx4#

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

ecbunoof5#

构建一个名为bool CheckBit(StudID,Date,num)的函数,其中传入StudID、Date和一个1到8之间的数字。将函数调用放入一个循环中,传入1 - 8,并记录返回true的次数

相关问题