在分组的单个LINQ查询中选择十进制和字符串匿名类型

时间:2014-10-16 17:23:02

标签: c# linq

我正试图解决如何在我的代码中使用LINQ的这一点。最终目标是输出总和(工作正常)以及与这些总和相关的人的姓名。

例如,如果Adam和Brad做了一笔交易,它应该输出如下内容:

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返回空值,要么在text / list字段中输出system.anonymous类型。

非常感谢任何和所有帮助。

亲切的问候。

1 个答案:

答案 0 :(得分:1)

由于每个合作伙伴都有两名员工,您可以使用First方法选择返回Employee,而不是使用返回Select的{​​{1}}

IEnumerable<Employee>

这假设所有合伙企业都有匹配的员工。如果某些员工可能丢失,请将Employee1 = set.First(s => s.e1.name), Employee2 = set.First(s => s.e2.name) 替换为First