将Sum Linq分组为C#中的SQL

vit*_*.sa 15 sql linq group-by sum

真的坚持使用Linq进行SQL分组和求和,已经到处搜索但我不太了解其他解决方案应用于我自己.

我的数据库中有一个名为view_ProjectTimeSummary的视图,它包含以下字段:

string_UserDescription
string_ProjectDescription
datetime_Date
double_Hours
Run Code Online (Sandbox Code Playgroud)

我有一个方法接受一个to和from日期参数,并首先创建此List <>:

List<view_UserTimeSummary> view_UserTimeSummaryToReturn = 
             (from linqtable_UserTimeSummaryView
              in datacontext_UserTimeSummary.GetTable<view_UserTimeSummary>()
              where linqtable_UserTimeSummaryView.datetime_Week <= datetime_To
              && linqtable_UserTimeSummaryView.datetime_Week >= datetime_From
              select linqtable_UserTimeSummaryView).ToList<view_UserTimeSummary>();
Run Code Online (Sandbox Code Playgroud)

在返回List(用作datagridview的数据源)之前,我使用相同名称的参数过滤string_UserDescription字段:

if (string_UserDescription != "")
        {
            view_UserTimeSummaryToReturn = 
                        (from c in view_UserTimeSummaryToReturn
                         where c.string_UserDescription == string_UserDescription
                         select c).ToList<view_UserTimeSummary>();
        }

return view_UserTimeSummaryToReturn;
Run Code Online (Sandbox Code Playgroud)

如何操作生成的List <>以显示该用户的项目double_Hours和来自和来自日期参数之间的项目的总和(而不是每个日期的单独条目)?

例如包含以下字段的Lis​​t <>:

string_UserDescription
string_ProjectDescription
double_SumOfHoursBetweenToAndFromDate
Run Code Online (Sandbox Code Playgroud)

我是对的,这意味着我将不得不返回一个不同类型的List <>(因为它的字段少于view_UserTimeSummary)?

我已经读过这样的总和它就像'group/by/into b'但是不明白这种语法如何通过查看其他解决方案...有人可以帮助我吗?

谢谢Steve

Amy*_*y B 34

首先定义一个类来保存结果:

public class GroupedRow
{
  public string UserDescription {get;set;}
  public string ProjectDescription {get;set;}
  public double SumOfHoursBetweenToAndFromDate {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

既然你已经应用过滤,那么剩下要做的就是组.

List<GroupedRow> result =
(
  from row in source
  group row by new { row.UserDescription, row.ProjectDescription } into g
  select new GroupedRow()
  {
    UserDescription = g.Key.UserDescription,
    ProjectDescription = g.Key.ProjectDescription,
    SumOfHoursBetweenToAndFromDate = g.Sum(x => x.Hours)
  }
).ToList();
Run Code Online (Sandbox Code Playgroud)

(或其他语法)

List<GroupedRow> result = source
  .GroupBy(row => new {row.UserDescription, row.ProjectDescription })
  .Select(g => new GroupedRow()
  {
    UserDescription = g.Key.UserDescription,
    ProjectDescription = g.Key.ProjectDescription,
    SumOfHoursBetweenToAndFromDate = g.Sum(x => x.Hours)
  })
  .ToList();
Run Code Online (Sandbox Code Playgroud)

  • @John的第一个语法是"查询理解"语法.其次是使用lambda表达式的方法调用.他们做同样的事情. (2认同)