我可以引用当前Select对象中的属性吗?

时间:2017-07-16 15:42:12

标签: c# linq

如果我有一个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)

...但我不想,如同大型集合或更复杂的计算,这可能会使查询速度过慢。

3 个答案:

答案 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)
                            });