2011-02-08 2 views
5

나는 asp.net C# 웹 응용 프로그램을 작성하고 있습니다; 'table1'이라는 이름의 메모리 내 데이터 테이블에 'country', 'productId'및 'productQuantity'이라는 세 개의 열이 있습니다. 첫 번째 열 'country'을 고정 열로 사용하고 동적 번호와 열 이름을 'product_1', 'product_2'등과 같이 새 테이블 ('table2'이라고 가정)을 얻으려면 해당 테이블을 피벗시키고 싶습니다. , 'table1'에있는 제품의 총 수에 따라 'product_n'; 첫 번째 열 'country'에 국가 이름이 포함되어야합니다. 동적 생성 된 열 'product_1', 'product_2', ..., 'product_n'나는를 작성하는 LINQ 쿼리 식을 사용하고 지정된 국가linq 트리 표현식을 사용하여 동적 열 피벗 테이블을 만드는 방법

의 각 특정 제품에 대한 selled 된 productQuantity를 포함해야합니다 암호; 문제는 내가 하드 코딩 할 수 없다는 것입니다 제품의 가치도 이름을; 나는 얼마나 많은 제품이 데이터 테이블에 존재하는지 예측할 수 없다. 지금은, 내가 다음 식을 사용하여 결과를 테스트하고 있습니다 :

view example image of the two tables table1 and table2

:

var query = table1.AsEnumerable() 
       .GroupBy(c => c.country) 
       .Select(g => new 
       { 
        country = g.Key, 
        product_1 = g.Where(c => c.productId == "a30-m").Select(c => c.productQuantity).FirstOrDefault(), 
        product_2 = g.Where(c => c.productId == "q29-s").Select(c => c.productQuantity).FirstOrDefault(), 
      . 
      . 
      . 
        product_n = g.Where(c => c.productId == "g33-r").Select(c => c.productQuantity).FirstOrDefault() 
       }); 

내가 'table1이'처럼 보이는 방법 방법에 대한 예를주는거야 '를 table2'과 같이해야한다

아무도 날 linq 트리 표현식 또는 다른 linq 메서드를 사용하여 동적 열 피벗 테이블을 만드는 솔루션을 찾는 데 도움이 될 수 있습니다; 도움을 주시면 감사하겠습니다.

+0

도움을 기다리고 있습니다 ... – user598956

답변

0

필자는 피벗 목록에이 확장 프로그램을 사용하고 있습니다.

public static Dictionary<TFirstKey, Dictionary<TSecondKey, TValue>> Pivot<TSource, TFirstKey, TSecondKey, TValue>(this IEnumerable<TSource> source, Func<TSource, TFirstKey> firstKeySelector, Func<TSource, TSecondKey> secondKeySelector, Func<IEnumerable<TSource>, TValue> aggregate) 
    { 
     var retVal = new Dictionary<TFirstKey, Dictionary<TSecondKey, TValue>>(); 

     var l = source.ToLookup(firstKeySelector); 
     foreach (var item in l) 
     { 
      var dict = new Dictionary<TSecondKey, TValue>(); 
      retVal.Add(item.Key, dict); 
      var subdict = item.ToLookup(secondKeySelector); 
      foreach (var subitem in subdict) 
      { 
       dict.Add(subitem.Key, aggregate(subitem)); 
      } 
     } 
     return retVal; 
    } 

희망 도움말.

+0

답장을 보내 주셔서 감사합니다. 그러나 제 경우에는 작동하지 않았습니다. – user598956

2

sql에서 동적 열 개수를 쿼리 할 수 ​​없습니다. 확장 기능을 사용하면 SQL을 기반으로하기 때문에 linq을 사용하여이 작업을 수행 할 수도 없습니다.

운이 좋지 않으니 죄송합니다. 당신이 (데이터 그리드의 열을 생성하는 동적으로 다음 등등 .Select(x => x.product).Distinct()을하고 의해 국가와 제품을 재구성 등) sql 서버에서 {country, product}의 모든 기존 쌍을 요청하고 클라이언트에서 나머지 처리를 할 수 그러나

.