sql - 如何计算对象/记录中的总项目并仅计算值 = true
问题描述
var obj = (from r in db.Module_Completion
.Where(r => r.star_id == User.Identity.Name)
select new
{
r.adv_stud_success,
r.important_policies,
r.technology,
r.finances,
r.resources,
r.student_life,
r.next_steps
}).FirstOrDefault();
obj = {真、假、假、真、...};这只是我使用 Linq 从数据库中查询的一条记录
原因是我想显示 Finsished 2 of 7 ,这就是为什么我需要计算记录中的项目。先感谢您!
public partial class Module_Completion
{
public int module_completionId { get; set; }
[StringLength(10)]
public string star_id { get; set; }
public bool adv_stud_success { get; set; }
public bool important_policies { get; set; }
public bool technology { get; set; }
public bool finances { get; set; }
public bool resources { get; set; }
public bool student_life { get; set; }
public bool next_steps { get; set; }
}
在我可以将数字存储在变量中之后,我想像这样显示“Finished 2 of 7”
解决方案
所以 EveryModuleCompletion
包含几个布尔属性。如果此类属性的值为 true,则您认为该项目已“完成”。
您想计算 ModuleCompletion 中已完成项目的数量。
正确的方法是将属性添加到类 ModuleCompletion。
public int FinishedCount => ...
如果您不能这样做,例如因为 ModuleCompletion 表示数据库中表的列,则考虑添加扩展方法。如果您不熟悉扩展方法,请阅读扩展方法揭秘
public static int CountFinished(this ModuleCompletion moduleCompletion)
{
// TODO: implement
}
用法是:
ModuleCompletion x = ...
int finished = x.CountFinished();
如果您的 ModuleCompletion 在本地进程中,这将起作用。但是,如果你想在数据库端做这个(作为可查询的),这是行不通的:你的数据库不知道方法 CountFinished。
如果你想让数据库这样做,你可以改变你的 Select 方法:
int finishedCount = db.ModuleCompletions
.Where(completion => completion.star_id == User.Identity.Name)
.Select(completion =>
completion.adv_stud_success ? 1 : 0 +
completion.important_policies ? 1 : 0 +
completion.technology : 1 : 0 +
...)
.FirstOrDefault();
这看起来相当难看。幸运的是,我们可以创建 的扩展方法IQueryable<ModuleCompletion>
,这样您就可以将其用作任何其他 LINQ 方法:
public static IQueryable<int> ToFinishedCount(this IQueryable<ModuleCompletion> moduleCompletions)
{
return moduleCompletions.Select(completion =>
completion.adv_stud_success ? 1 : 0 +
completion.important_policies ? 1 : 0 +
completion.technology : 1 : 0 +
...);
}
此查询可以翻译成您的 DBMS 可以理解的语言。使用会更容易理解,更容易重用,单元测试和修改:
int finishedCount = db.ModuleCompletions
.Where(completion => completion.star_id == User.Identity.Name)
.ToFinishedCount()
.FirstOrDefault();
推荐阅读
- jenkins - 问题设置 Jenkins cron
- flutter - 如何在flutter textformfield中将输入文本颜色从黑色更改为白色
- flutter - Flutter 使用 Hook 实现动画
- swift - onReceive 在 swiftUI 中无限调用
- reactjs - 反应管理员:
不适用于自定义 dataProvider - google-apps-script - 在 Google 表格中插入新行或编辑行时添加时间戳
- javascript - iFrame window.postMessage - 数据始终为空字符串
- javascript - 使用动画(Javascript)动态更新 amCharts 4 世界地图?
- r - Fisher 对 2x10 偶然性的检验(单元格的 >20% 中的预期值 <6) - 解决 R 工作区错误,或者建议替代统计检验?
- cocoa - Quartz 2D 实现 html5 画布 globalCompositeOperation