16

Linq to SQL のグループ化と集計に本当に固執し、どこでも検索しましたが、他のソリューションを自分自身に適用するのに十分な理解がありません。

データベースに view_ProjectTimeSummary というビューがあり、これには次のフィールドがあります。

string_UserDescription
string_ProjectDescription
datetime_Date
double_Hours

to および from date パラメータを受け取り、最初にこの 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<> を操作して、そのユーザーとプロジェクトのフィールド double_Hours の to と from の日付パラメーターの合計を表示するにはどうすればよいですか(日付ごとに個別のエントリではありません)。

たとえば、次のフィールドを持つ 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 に答える