2013-05-21 5 views
12

LinqとSQLのグループ化と集計に本当にかかわっていますが、どこでも検索しましたが、私自身は他のソリューションを適用するには十分理解していません。グループでLinqとCとの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の合計を表示する>結果の一覧<を操作するのですか?

次のフィールドを持つリスト<>:

string_UserDescription 
string_ProjectDescription 
double_SumOfHoursBetweenToAndFromDate 

が、これは(それがview_UserTimeSummary未満のフィールドがありますので)私は>リスト<の異なる型を返すしなければならない意味します右のことをIアム?

私はそれを 'group/by/into b'のようなものにしていますが、この構文が他のソリューションを見てどのように働くのか分かりません。

おかげ スティーブ

+0

おかげでデビッド - 素晴らしい作品 - それは私のDataGridViewに表示されていなかったので、私は最初に、取得/設定の一部を使用するとは何かを忘れてしまいましたリスト内のオブジェクトにプロパティではなくフィールドのみがある場合は、列を自動生成する... –

答えて

29
は、結果を保持するクラスを定義することから始め

:あなたはすでにフィルタリングを適用したので

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

GroupedRowにINotifyPropertyChangingとINotifyPropertyChangedを実装する必要があります。 –

+0

第1構文と第2構文の違いは何ですか?これらの2つの専門用語がありますか? – mko

+2

@Johnの最初の構文は「クエリー理解」構文です。 2番目はラムダ式を使ったメソッド呼び出しです。彼らは同じことをする。 –