如果我有一个Person对象的集合,每个对象都会有购买和推荐,我真正想做的就是以下内容......
Peoples.Select(p => new {
p.ID,
p.Name,
Bought = p.Purchases.Sum(pu => pu.Quantity),
Referred = p.Referrals.Sum(r => r.Quantity),
Total = this.Bought + this.Referred
})
我意识到最后一行不正确,但我想知道是否有一种巧妙的方法可以做到这一点,除了必须再次遍历整个集合并设置总计?
我知道我可以做以下事情......
Bought = p.Purchases.Sum(pu => pu.Quantity),
Referred = p.Referrals.Sum(r => r.Quantity),
Total = p.Purchases.Sum(pu => pu.Quantity) + p.Referrals.Sum(r => r.Quantity)
...但我不想,如同大型集合或更复杂的计算,这可能会使查询速度过慢。
答案 0 :(得分:4)
如果切换到查询语法,可以使用let
var results = from p in People
let bought = p.Purchases.Sum(pu => pu.Quantity)
let referred = p.Referrals.Sum(r => r.Quantity)
select new {
p.ID,
p.Name,
Bought = bought,
Referred = referred,
Total = bought + referred
};
答案 1 :(得分:3)
您可以添加更多大括号并返回新对象,而不是使用返回第一个表达式的lambda。现在,您可以使用此函数的范围将"+"
和bought
分配给变量,然后重复使用它们。
referred
答案 2 :(得分:3)
通过引入具有计算的getter
的类的另一种方法public class PersonTotal
{
public string Id { get; set; }
public string Name { get; set; }
public int Bought { get; set; }
public int Referred { get; set; }
public int Total => Bougth + Referred;
}
然后在Select
var person = Peoples.Select(person => new PersonTotal
{
Id = person.ID,
Name = person.Name,
Bought = person.Purchases.Sum(p => pu.Quantity),
Referred = person.Referrals.Sum(r => r.Quantity)
});