2010-11-23 2 views
2

DataGridview (winform)에 LINQ에서 하나의 명령문 쿼리를 제공하려고합니다. 다음 행은 합계에 따라 부채 또는 신용 회원에게 레코드 값의 합을 할당합니다.새 동적 객체를 만들 때 인라인 된 작업

거래 (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 메서드를 여러 번 호출하는 것을 방지하는 방법은 무엇입니까? 다시 생각해보고 통화량을 줄이려는 아이디어?

  2. 기본적으로 이전 잔액 합계와 현재 잔액 합계를 계산하는 Balance라는 새로운 멤버를 추가하고 싶습니다. 새로운 문장에서 직접 할 수 있습니까? 대리인을 사용하고 있습니까? 첫 번째 질문에 대해서는

안부

답변

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가 이전 반복에 대한 참조를 허용하지 않기 때문에 귀하의 솔루션이 깨끗하다고 ​​생각합니다. 그래서 타이! – camous

관련 문제