【问题标题】:Group By Sum Linq to SQL in C#在 C# 中按 Sum Linq 分组到 SQL
【发布时间】:2013-05-16 09:00:31
【问题描述】:

真的坚持使用 Linq to SQL 分组和求和,到处搜索,但我不了解将其他解决方案应用于我自己的解决方案。

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

string_UserDescription
string_ProjectDescription
datetime_Date
double_Hours

我有一个方法,它接受一个往返日期参数并首先创建这个列表:

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

在返回列表(用作 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;

我如何操作生成的列表 以显示该用户和项目在结束日期和结束日期参数之间的字段 double_Hours 的 sum(而不是每个日期的单独条目)?

例如具有以下字段的 List:

string_UserDescription
string_ProjectDescription
double_SumOfHoursBetweenToAndFromDate

这是否意味着我必须返回不同类型的 List(因为它的字段少于 view_UserTimeSummary)?

我已经读过它以获得类似于“group / by / into b”之类的总和,但通过查看其他解决方案不明白这种语法是如何工作的......有人可以帮助我吗?

谢谢 史蒂夫

【问题讨论】:

    标签: sql linq group-by sum


    【解决方案1】:

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

    public class GroupedRow
    {
      public string UserDescription {get;set;}
      public string ProjectDescription {get;set;}
      public double SumOfHoursBetweenToAndFromDate {get;set;}
    }
    

    由于您已经应用了过滤,剩下要做的就是分组。

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

    (或其他语法)

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

    【讨论】:

    • 您可能需要在 GroupedRow 上实现 INotifyPropertyChanging 和 INotifyPropertyChanged
    • 第一种和第二种语法有什么区别。这两者有不同的术语吗?
    • @John 第一个语法是“查询理解”语法。其次是使用 lambda 表达式的方法调用。他们做同样的事情。
    • 感谢您陈述术语。我知道他们做同样的事情,但想澄清它的名称
    • 第一个叫Query语法,第二个叫Fluent syntax
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多