2011-02-08 43 views
5

Tôi đang viết một ứng dụng web asp.net C#; tôi có một bộ nhớ trong bộ nhớ có tên là 'table1' có ba cột 'country', 'productId' và 'productQuantity'; tôi muốn xoay bảng đó để lấy bảng mới (giả sử 'table2') có cột đầu tiên 'country' làm cột cố định và số động và tên cột 'product_1', 'product_2', ... , 'product_n' theo tổng số sản phẩm hiện có trong 'table1'; cột đầu tiên 'country' phải chứa tên quốc gia; năng động tạo ra các cột 'product_1', 'product_2', ..., 'product_n' phải có các productQuantity đã được selled cho mỗi sản phẩm cụ thể trong nước quy địnhcách tạo bảng tổng hợp với cột động bằng cách sử dụng biểu thức cây linq

Tôi đang sử dụng biểu thức truy vấn LINQ to viết mã; vấn đề là tôi không thể mã hóa cứng tên không phải là giá trị của sản phẩm; tôi không thể dự đoán có bao nhiêu sản phẩm tồn tại trong datatable; cho bây giờ, tôi đang kiểm tra kết quả bằng cách sử dụng biểu thức sau đây:

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() 
       }); 

tôi đưa ra một ví dụ về cách 'table1' trông giống như và làm thế nào 'table2' phải trông giống như:

view example image of the two tables table1 and table2

bất kỳ ai cũng có thể giúp tôi tìm giải pháp để tạo bảng tổng hợp với cột động bằng cách sử dụng biểu thức cây linq hoặc phương pháp LINQ khác; bất kỳ trợ giúp nào sẽ được đánh giá cao.

+0

chờ bất kỳ trợ giúp nào ... – user598956

Trả lời

0

Tôi đã sử dụng tiện ích mở rộng này cho danh sách xoay vòng.

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; 
    } 

Hy vọng trợ giúp này.

+0

cảm ơn câu trả lời của bạn, nhưng nó không hoạt động trong trường hợp của tôi. – user598956

2

Không thể truy vấn số cột động trong sql. Bằng cách mở rộng nó không thể làm điều đó với linq hoặc vì nó được dựa trên sql.

Vì vậy, bạn đã hết may mắn, xin lỗi.

Tuy nhiên bạn có thể yêu cầu tất cả các cặp hiện tại {country, product} từ máy chủ sql và thực hiện việc xử lý còn lại trên máy khách (làm lại các quốc gia và sản phẩm bằng cách thực hiện .Select(x => x.product).Distinct() và vv.

Các vấn đề liên quan