16

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

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

string_UserDescription
string_ProjectDescription
datetime_Date
double_Hours

我有一个接受往返日期参数的方法,并首先创建这个 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>();

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

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

例如具有以下字段的 List<>:

string_UserDescription
string_ProjectDescription
double_SumOfHoursBetweenToAndFromDate

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

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

谢谢史蒂夫

4

1 回答 1

36

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

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();
于 2013-05-21T14:47:10.657 回答