2014-10-16 17 views
1

我正在嘗試圍繞如何在我的代碼中處理這一點LINQ。最終目標是輸出總和(工作正常)以及與這些總額相關的人的姓名。在分組的單個LINQ查詢中選擇十進制和字符串匿名類型

舉例來說,如果亞當和布拉德做一筆交易,它應該輸出類似:

Adam and Brad made $50/£20 profit

所有這些信息都存儲在多個表的數據庫中,並通過合作伙伴ID分組。它看起來像這樣:

var Profit = (from Yield in Total 
       join w in totalsDB.wager on Yield.wager_id equals w.id 
       join p in totalsDB.partnership on w.partnership_id equals p.id 
       join e1 in totalsDB.employees on p.employee1_id equals e1.id 
       join e2 in totalsDB.employees on p.employee2_id equals e2.id 
       group Yield by p.partnership_id into set 
       select new 
       { 
       Partnership = set.Key, 
       USD = set.Sum(s => (decimal)s.p_and_l/(decimal)s.exchange_usd), 
       GBP = set.Sum(s => (decimal)s.p_and_l/(decimal)s.exchange_gbp), 
       size = set.Sum(s => (decimal)s.size/(decimal)s.exchange_gbp), 
       Employee1 = set.Select(s => s.e1.name), 
       Employee2 = set.Select(s => s.e2.name) 
       }).ToList(); 

我有一種感覺,這個問題可以是與我,或者可能與我想選擇的方式加入的職員表的兩倍的方式。

然後我試圖輸出在以下幾個方面(曾經嘗試都雖然他們「大多是」工作......員工姓名被踢我的牙齒:

foreach (var partnerYield in Profit) 
        { 
        string[] partYield = new string[] { "{0} and {1} made ${2:#,0}/£{3:#,0} profit", partnerYield.Employee1.ToString(), partnerYield.Employee2.ToString(), partnerYield.USD.ToString(), partnerYield.GBP.ToString() }; 
        listview_partnerYield.Items.Add(partnerYield.Partnership.ToString()).SubItems.AddRange(partYield); 

// OR 

        txt_partnerYield.Text += string.Format("{0} and {1} made ${1:#,0}/£{2:#,0} profit" + System.Environment.NewLine, partnerYield.Employee1, partnerYield.Employee2, partnerYield.USD, partnerYield.GBP); 
        } 

因爲它的立場,它或者根本不返回空值工作員工ID,或在文本/列表字段輸出system.anonymous類型。

任何和所有幫助將不勝感激。

親切的問候。

回答

1

由於每個合作伙伴有兩個員工,你可以拾取它們與First方法與回報Employee,而不是使用Select,它返回IEnumerable<Employee>

Employee1 = set.First(s => s.e1.name), 
Employee2 = set.First(s => s.e2.name) 

這是假設所有的夥伴關係相匹配的員工。如果某些員工可能缺失,請用FirstOrDefault替換First