2009-03-14 5 views
0

데이터 컨트롤에 바인딩되는 제품 설명 및 제품 가격에 대한 간략한 주문 요약을 반환하는 linq 쿼리가 있습니다. 세금 정보를 표시하는 동일한 컨트롤에 바인딩 할 행을 추가하고 싶습니다. 상품 설명란은 단순히 '세금'이라고 말하고 제품 가격 항목은 세금을 부과합니다.Linq - 표시 전용 결과에 행 추가

나는이 결과의 DataTable을 검색하고 단순히 NewRow()를 수행 한 다음 내 컨트롤의 데이터 소스를 DataTable로 설정하는 데 사용했습니다. 나는 SQL에 LINQ를 사용할 때 이와 동등한 기술을 찾고있다. 감사.

답변

1

LINQ 쿼리의 결과에 다른 "행"을 쉽게 추가 할 수 있도록 쿼리 결과를 보관할 클래스를 만드는 것이 좋습니다. 그런 다음 결과를 목록으로 변환하고 세금을 계산 한 다음 세금을 클래스의 개체로 추가 할 수 있습니다.

public class OrderSummary 
{ 
    public string Description { get; set; } 
    public decimal Amount { get; set; } 
} 


var taxRate = ... 
var orderSummary = db.Orders.Where(o => o.ID == id) 
          .Select(o => new OrderSummary 
           { 
            Description = o.Product 
                .Details 
                .Description, 
            Amount = o.Qty * o.Product.Price 
           }) 
          .ToList(); 

var tax = new OrderSummary 
       { 
        Description = "Tax", 
        Amount = orderSummary.Sum(o => o.Amount * taxRate); 
       }; 
orderSummary.Add(tax); 

그런 다음 설명을 키로 사용하고 금액을 값으로 사용하여 컨트롤을 바인딩 할 수 있습니다.

+0

이것은 제대로 작동하는 것 같습니다. 한 가지 질문은 제품 테이블과 관련된 주문 세부 테이블에서 결과를 얻고 있으므로 설명에 도달하려면 orderSummary.Product.Description = "Tax"를 수행해야합니다. 내가 할 수 있니? 내가 그것을 추가 할 때 작동하지 않습니다. –

+0

내가 설명한대로 새로운 수업을 듣고 있습니까? 간접 지정을 반영하기 위해 예제를 업데이트하겠습니다. – tvanfosson

+0

현재 주문 세부 객체를 반환하는 함수가 있지만 쉽게 사용할 수 있으면 클래스를 변경할 수 있습니다. –

3

orderSummary.Union(taxRow)

+0

'System.Linq.Enumerable.Union (System.Collections.Generic.IEnumerable , System.Collections.Generic.IEnumerable ) 메서드의 형식 인수를 사용하려고하면이 인수를 사용하려고합니다. 형식 인수를 명시 적으로 지정하십시오. –

+0

orderSummaries.Union (new List () {새 OrderSummary() {ProductDescription = "Tax", Amount = taxAmount}})와 같은 작업이 필요할 수 있습니다. // 같은 포인트, 세금 행을 OrderSummary의 1 항목 목록으로 만들고, 나머지 부분과 결합합니다. –

+0

+1 - btw, 사용 : orderSummaries.Union (new [] {new OrderSummary() {...}); 짧은 버전을 위해 :) – eglasius