2010-11-23 10 views
2

DataGridview(winform)にLINQで1つのステートメントクエリを提供しようとしています。 次の行は、合計額に応じて債務または信用組合のいずれかにレコード値の合計を割り当てます。新しい動的オブジェクトを作成するときのインライン操作

トランザクション1 --- *記録

var transactions = from t in this.account.transactions select new { 
       Debt = t.records.Sum(x=>x.value) < 0 ? t.records.Sum(x=>x.value).ToString() : String.Empty, 
       Credit = t.records.Sum(x => x.value) > 0 ? t.records.Sum(x => x.value).ToString() : String.Empty 
      }; 

しかし、私は二つの問題に直面しています、これらは非常に簡単に解決することができますが、私はクリーンで効率的な何かを探しています。

  1. どのようにしてSumメソッドを何度も呼び出すのを防ぎますか?どのようなアイデアを再要因と呼び出しの量を減らすために?

    基本的に前回の残高合計と現在の残高合計を合計する新しいメンバーBalanceを追加したいと思います。それは新しい声明で直接行うことが可能ですか?デリゲートを使用していますか?あなたの最初の質問については

よろしく

答えて

2

、ここにあなたがそれを行うことができる方法です:あなたの2番目の質問については

var transactions = from t in this.account.transactions 
        let sum = t.records.Sum(x => x.value) 
        select new 
        { 
         Debt = sum < 0 ? sum.ToString() : String.Empty, 
         Credit = sum > 0 ? sum.ToString() : String.Empty 
        }; 

、私は本当にだけでなくきれいなソリューションに興味があると思います。 LINQは、単一のレコード以外のもので動作するようには設計されていないようです。あなたはできます

double balance = 0; 
var transactions = from t in this.account.transactions 
        let sum = t.records.Sum(x => x.value) 
        let newBalance = balance += sum 
        select new 
        { 
         Debt = sum < 0 ? sum.ToString() : String.Empty, 
         Credit = sum > 0 ? sum.ToString() : String.Empty, 
         Balance = newBalance.ToString() 
        }; 

しかし、私はこれを "クリーン"と呼んでいません。 =)

+0

#1のソリューションは素晴らしいです。問題#2の解決策に関しては、linqは以前の繰り返しを参照することができないので、あなたの解決策はきれいだと思います。だからTY! – camous

関連する問題