Linq选择在计算字段中使用先前属性的查询

时间:2017-03-14 21:11:01

标签: c# linq select

我有几个属性是在查询的选择部分的LINQ查询中计算出来的。我需要使用这些属性的结果在单独的属性中执行另一个计算。

目前我正在做这个

var query = data
    .Select(model => new 
    {
        SomeProperty1 = model.Sum(x => x.Foo),
        SomeProperty2 = model.Sum(x => x.Bar),
        SomeProperty3 = model.Sum(x => x.Bar) == 0 ? 0 : 
            model.Sum(x => x.Foo) / model.Sum(x => x.Bar)
    };

想知道我是否有办法做到这一点

var query = data
    .Select(model => new 
    {
        SomeProperty1 = model.Sum(x => x.Foo),
        SomeProperty2 = model.Sum(x => x.Bar),
        SomeProperty3 = this.SomeProperty2 == 0 ? 0 : 
            this.SomeProperty1 / this.SomeProperty2
    };

为简洁起见,大大缩短了示例。在我的实际查询中,计算更加冗长。

我相信这可以在模型中属性的get部分完成,但只是想知道它是否可以像上面的linq查询中所示完成。

提前致谢!

1 个答案:

答案 0 :(得分:4)

您不能在对象初始值设定项(C#Specification 7.6.10.2)中引用新创建的对象,但可以在LINQ查询中引入新的查询变量:

var query = from model in data
            let SomeProperty1 = model.Sum(x => x.Foo)
            let SomeProperty2 = model.Sum(x => x.Bar)
            select new {
                SomeProperty1,
                SomeProperty2,
                SomeProperty3 = SomeProperty2 == 0 ? 0 : SomeProperty1 / SomeProperty2
            };

还要记住,当divident和divisor都是整数时,使用整数除法。