2013-09-23 2 views
0

누구나 LINQ를 사용하여이 작업을 수행 할 수있는 제안이 있습니까?그룹을 수행하고 LINQ를 사용하여 가입하십시오.

var statements = db.vwOutstandingStatements.ToList(); 

var amounts = (from s in db.vwOutstandingStatements 
        group s by s.Id into v 
        select new 
        { 
         Id = v.Key, 
         amount = v.Sum(a => a.Amount) 
        }).ToList(); 

List<vmVendorStatements> statementsToProcess = new List<vmVendorStatements>(); 

foreach (var amount in amounts) 
{ 
    var statement = statements.Find(s => s.Id == amount.Id); 
    statementsToProcess.Add(new vmVendorStatements() 
    { 
     Id = statement.Id, 
     PropertyAddress = statement.PropertyNumber + " " + statement.PropertyStreet + " " + statement.PropertyTown, 
     StatementDate = statement.StatementDate.ToLongDateString(), 
     Amount = amount.amount.ToString() 
    }); 
} 

Statements는 SQL보기의 EF5입니다. LINQ를 실행하여 반환 된 뷰의 금액 합계로 그룹화 된 데이터를 가져온 다음 합쳐서 합계 금액과 함께 반환 된 뷰의 일부 세부 정보를 표시합니다. StatementsToView는 MVC 뷰로 데이터를 가져 오는 내 뷰 모델입니다.

나는 그것이 SQL로 행해질 수 있다고 확신한다. 그리고 나는 그 어떤 경우에도 그렇게 할 것이다. 그러나 또한 거기에 더 멋진 해결책이 있어야하는 것처럼 보인다.

감사합니다.

제이슨.

+0

하자가 무엇을위한 것입니다! –

답변

3

당신은 첫 번째 항목을 찾아 바로 다시 쿼리보다는 그룹의 첫 번째 항목을 잡아 수 있습니다

var statementsToProcess = 
    (from s in db.vwOutstandingStatements 
    group s by s.Id into v 
    let first = v.First() 
    select new vmVendorStatements() 
    { 
     Id = v.Key, 
     amount = v.Sum(a => a.Amount), 
     PropertyAddress = first.PropertyNumber + " " + first.PropertyStreet + " " + first.PropertyTown, 
     StatementDate = first.StatementDate.ToLongDateString(), 
    }).ToList(); 
+0

코드를 보내 주셔서 감사합니다. 거의 일했다. First() 대신 FirstOrDefault()를 사용해야하고 .ToLongDateString()이 컴파일되지 않아서 DataAnnotation을 viewmodel에 사용하여 DateTime 속성의 날짜 부분 만 표시했습니다 (먼저 DateTime 유형으로 변환 함) –

관련 문제