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

本文关键字:类型 查询 LINQ 单个 选择 字符串 十进制 | 更新日期: 2023-09-27 18:26:43

我正试图了解如何在代码中使用这部分LINQ。最终目标是输出总和(运行良好)以及与这些总和相关的人的姓名。

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

Adam and Brad made $50 / £20 profit

所有这些信息都存储在DB中的多个表中,并按合作伙伴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返回null,要么在text/list字段中输出system.anonymous类型。

如有任何帮助,我们将不胜感激。

谨致问候。

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

由于每个合作伙伴都有两名员工,您可以使用返回EmployeeFirst方法来挑选他们,而不是使用返回IEnumerable<Employee>Select方法

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

这是假设所有合作伙伴都有匹配的员工。如果某些员工可能失踪,请将First替换为FirstOrDefault