C# 计算列表中某列的总和<;类别>;
我试图为通过的项目参数计算timecard类中的小时总数。我对LINQ、MVC、导航属性和Lambda表达式已经足够陌生了,我一直在追根究底,试图在我的ViewModel构造函数中实现这些 我有以下几点: ProjectTimecardViewModel.csC# 计算列表中某列的总和<;类别>;,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
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)。工作起来很有魅力。