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

标签 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 查询中所示那样完成。

提前致谢!

最佳答案

您不能在对象初始值设定项中引用新创建的对象(C# 规范 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
            };

另请记住,当被除数和除数都是整数时,将使用整数除法。

关于c# - 在计算字段中使用先前属性的 Linq 选择查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42796616/

相关文章:

c# - @Parameter1 不是过程的参数

c# - 使用 LINQ 在 LIST 中的最大和最小日期之间添加缺失日期列表

c# - 验证十进制值列表(或该列表的子列表)是否可以等于某个总和

php - 在 PHP 中使用数组自动填充选择框

使用 LIKE 和 IN 的 MYSQL 子查询

go - 这是实现超时的常见方法,为什么 time.After 不起作用

c# - 空路径名不合法

c# - 如何将 CL 的现有 NuGet 包与 Roslyn 分析器结合起来?

c# - 在 C# 中应用 DeMorgan 定理手动优化条件语句中的 bool 表达式是否有用(例如 if 条件)

c# - 在写入 Logger 或 Console 时将 foreach 转换为 LINQ