在单个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类型。
如有任何帮助,我们将不胜感激。
谨致问候。
由于每个合作伙伴都有两名员工,您可以使用返回Employee
的First
方法来挑选他们,而不是使用返回IEnumerable<Employee>
的Select
方法
Employee1 = set.First(s => s.e1.name),
Employee2 = set.First(s => s.e2.name)
这是假设所有合作伙伴都有匹配的员工。如果某些员工可能失踪,请将First
替换为FirstOrDefault
。