Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 计算列表中某列的总和<;类别>;_C#_Sql Server_Linq - Fatal编程技术网

C# 计算列表中某列的总和<;类别>;

C# 计算列表中某列的总和<;类别>;,c#,sql-server,linq,C#,Sql Server,Linq,我试图为通过的项目参数计算timecard类中的小时总数。我对LINQ、MVC、导航属性和Lambda表达式已经足够陌生了,我一直在追根究底,试图在我的ViewModel构造函数中实现这些 我有以下几点: ProjectTimecardViewModel.cs public class ProjectTImecardViewModel { public int? ProjectId { get; set; } public string ProjectName { get; se

我试图为通过的项目参数计算timecard类中的小时总数。我对LINQ、MVC、导航属性和Lambda表达式已经足够陌生了,我一直在追根究底,试图在我的ViewModel构造函数中实现这些

我有以下几点: ProjectTimecardViewModel.cs

public class ProjectTImecardViewModel
{
    public int? ProjectId { get; set; }
    public string ProjectName { get; set; }
    public decimal TotalHours { get; set; }
    public List<Timecard> Timecards { get; set; }

    public ProjectTImecardViewModel(Project project)
    {
        ProjectId = project.ProjectId;
        ProjectName = project.ProjectName;
        Timecards = project.Timecards;

        //equivalent of what I want in SQL
        // TotalHours = SELECT SUM(Hours) FROM [Timecards] WHERE ProjectId = @ProjectId
        // best guess at what I want in LINQ
        // TotalHours = (from hours in Timecards where ProjectId == project.ProjectId select hours).Sum();
    }
}
Project.cs

public class Project
{
    public int ProjectId { get; set; }
    public string ProjectName { get; set; }
    ...
    public List<Timecard> Timecards { get; set; }

    public Project()
    {
        Timecards = new List<Timecard>();
    }
}
公共类项目
{
公共int ProjectId{get;set;}
公共字符串ProjectName{get;set;}
...
公共列表时间卡{get;set;}
公共工程()
{
时间卡=新列表();
}
}
我知道我可以创建一个类来初始化我的dbContext,并通过这种方式找出等效的LINQ语法,但我知道的唯一方法是在代码中公开我的连接字符串。值得一提的是,这是连接到MSSQL服务器的代码第一个EF核心


我知道这种语法并不完全有效,但是否有类似的东西可以与现有导航属性或现有类上的lambda表达式一起使用,以
TotalHours=(从Timecards.hours中的hours开始,其中projectd==project.projectd select hours).Sum()?因为列表中并没有小时的定义,所以我得到了小时下的红色曲线。或者有没有其他方法我可以列出小时数并运行上面的LINQ?我想您只需要使用
Sum

TotalHours = Timecards.Sum(c => c.Hours);
或者,如果您需要项目ID块:

TotalHours = Timecards.Where(c => c.ProjectId == ProjectId).Sum(c => c.Hours);

尝试将其纳入查询语法可能不值得努力。

我认为您只需要使用
Sum

TotalHours = Timecards.Sum(c => c.Hours);
或者,如果您需要项目ID块:

TotalHours = Timecards.Where(c => c.ProjectId == ProjectId).Sum(c => c.Hours);

尝试将其纳入查询语法可能不值得努力。

类似于
double hoursSum=Timecards.Where(tc=>tc.ProjectId==id.Sum(tc=>tc.Hours)?如果要更正查询,它必须是
TotalHours=(从Timecards中的card开始,其中card.ProjectId==project.ProjectId选择card.Hours)。Sum()
为什么要将
项目ID
存储在
ProjectTImecardViewModel
中?为什么不完整的
Project
reference?@JeroenvanLangen项目ID和项目名称在视图块中作为页面标题。类似于
double hoursSum=Timecards.Where(tc=>tc.projectd==ID).Sum(tc=>tc.Hours)?如果要更正查询,它必须是
TotalHours=(从Timecards中的card开始,其中card.ProjectId==project.ProjectId选择card.Hours)。Sum()
为什么要将
项目ID
存储在
ProjectTImecardViewModel
中?为什么不完整的
Project
reference?@JeroenvanLangen项目ID和项目名称在视图块中作为页面标题。
TotalHours=Timecards.Where(c=>c.projectd.HasValue&&c.projectd.Value==projectd.Sum(c=>c.Hours)
您应该用HasValue检查可为null的int(int?ProjectId)。@JeroenvanLangen我相信为了比较的目的,这实际上是安全的。将对任何实际的
int
执行隐式强制转换,如果
ProjectId
为null,则任何比较(针对null的比较除外)将返回false(在C#interactive中验证),这将使我达到目的。我尝试了两种方法中的后一种,我的视图上的DisplayFor显示为0.00,但我认为这更可能是因为某个地方的导航不好。lambda语法是我希望得到的东西。是的,忘记了控制器中的.Include(p=>p.Timecards)。工作起来像个符咒。
TotalHours=Timecards.Where(c=>c.projectd.HasValue&&c.projectd.Value==projectd.Sum(c=>c.Hours)
您应该用HasValue检查可为null的int(int?ProjectId)。@JeroenvanLangen我相信为了比较的目的,这实际上是安全的。将对任何实际的
int
执行隐式强制转换,如果
ProjectId
为null,则任何比较(针对null的比较除外)将返回false(在C#interactive中验证),这将使我达到目的。我尝试了两种方法中的后一种,我的视图上的DisplayFor显示为0.00,但我认为这更可能是因为某个地方的导航不好。lambda语法是我希望得到的东西。是的,忘记了控制器中的.Include(p=>p.Timecards)。工作起来很有魅力。