2013-05-21 32 views
12

真的堅持Linq到SQL分組和求和,到處都是搜索,但我不太瞭解將其他解決方案應用於我自己的方法。通過將Linq轉換爲SQL中的C#

我在我的數據庫中調用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少字段)?

我已經讀過,得到的總和它是'group/by/into b'之類的東西,但不明白這個語法是如何從其他解決方案看到的......有人可以幫我嗎?

感謝 史蒂夫

+0

感謝大衛 - 偉大工程 - 我忘了最初使用的get/set部分,因此它並沒有在我的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

第一個和第二個語法之間的區別是什麼。這兩個術語是否有區別? – mko

+2

@John第一種語法是「查詢理解」語法。其次是使用lambda表達式的方法調用。他們做同樣的事情。 –