web-dev-qa-db-ja.com

Group By Sum Linq to C#でのSQL

本当に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のsumを表示するにはどうすればよいですか?

例えば次のフィールドを持つList <>:

string_UserDescription
string_ProjectDescription
double_SumOfHoursBetweenToAndFromDate

これは、異なるタイプのList <>を返す必要があることを意味すると思います(view_UserTimeSummaryよりもフィールドが少ないため)。

私はそれを読んで合計を得るために「group/by/into b」のようなものですが、この構文が他のソリューションを見てどのように機能するか理解していません...誰かが私を助けてくれますか?

おかげでスティーブ

14
vitalsigns.sa

結果を保持するクラスを定義することから始めます。

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();
32
Amy B