2017-03-14 3 views
2

クエリの選択部分のLINQクエリで計算される2つのプロパティがあります。別のプロパティで別の計算を実行するには、これらのプロパティの結果を使用する必要があります。私はこの計算されたフィールドで以前のプロパティを使用するLinq selectクエリ

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 
    }; 

例が大幅に簡潔にするために短縮されて行うことができますいくつかの方法があった場合

現在、私がやっている方法をこの

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

は思っていました。私の実際のクエリでは、計算にはかなり時間がかかります。

これはモデルのプロパティのget部分で実行できると思いますが、linqクエリで上記のように実行できるかどうかは不思議でした。

ありがとうございます!

答えて

4

あなたは、オブジェクト初期化子(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 
      }; 

た場合も、整数の除算が使用されていることを心に留めておきます除算と除数は整数です。

+0

私が望むよりも冗長な表現ですが、クエリの現在の状態よりも優れています。私はこれを答えとして受け入れます。 –

+0

@DavidLeeの利点は、合計がここで一度だけ計算されることです。 –

+0

これらの変数をネストできますか? –

関連する問題