首页 > 解决方案 > 如何计算对象/记录中的总项目并仅计算值 = 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”

标签: sqlasp.net-mvclinq

解决方案


所以 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();

推荐阅读