2013-07-31 23 views
7

tôi có một bảng gọi là Languagemaster có dưới kỷ lụcLàm thế nào để Chuyển đổi Row để cột trong LINQ và SQL

language keyName keyValue 
English City AA 
Swedish City AAswedish 
German  City AAger 
Chines  City AAchines 
French  City AAfr 
Spanish City AAspanish 

làm thế nào để chuyển đổi Languagemaster Bảng dưới bảng

keyName English Swedish German Chines French Spanish    
City  AA  AAswedish AAger AAchines AAfr AAspanish 

xin vui lòng cho tôi biết cách viết Query trong cả SOL và LINQ.

+0

thể trùng lặp của [LINQ cột hoán đổi thành hàng] (http://stackoverflow.com/questions/6950495/linq-swap-columns-into-rows) – Fals

+0

vẻ giống như bạn muốn nhóm các cột theo giá trị 'keyName'. – YD1m

Trả lời

16

CẬP NHẬT: Tôi tạo ra theo phương pháp chung chung mà có thể xây dựng bảng pivot từ bất kỳ bộ sưu tập

public static DataTable ToPivotTable<T, TColumn, TRow, TData>(
    this IEnumerable<T> source, 
    Func<T, TColumn> columnSelector, 
    Expression<Func<T, TRow>> rowSelector, 
    Func<IEnumerable<T>, TData> dataSelector) 
{ 
    DataTable table = new DataTable(); 
    var rowName = ((MemberExpression)rowSelector.Body).Member.Name; 
    table.Columns.Add(new DataColumn(rowName)); 
    var columns = source.Select(columnSelector).Distinct(); 

    foreach (var column in columns) 
     table.Columns.Add(new DataColumn(column.ToString())); 

    var rows = source.GroupBy(rowSelector.Compile()) 
        .Select(rowGroup => new { 
         Key = rowGroup.Key, 
         Values = columns.GroupJoin(
          rowGroup, 
          c => c, 
          r => columnSelector(r), 
          (c, columnGroup) => dataSelector(columnGroup)) 
        }); 

    foreach (var row in rows) { 
     var dataRow = table.NewRow(); 
     var items = row.Values.Cast<object>().ToList(); 
     items.Insert(0, row.Key); 
     dataRow.ItemArray = items.ToArray(); 
     table.Rows.Add(dataRow); 
    } 

    return table; 
} 

Cách sử dụng:

var table = Languagemaster.ToPivotTable(
       item => item.language, 
       item => item.keyName, 
       items => items.Any() ? items.First().keyValue : null); 

Nó có ba thông số:

  • cột bộ chọn thuộc tính chọn cột (tức là những gì sẽ được trong tiêu đề cột) trong trường hợp của bạn nó là giá trị khác biệt của ngôn ngữ, nhưng nó có thể là bất cứ điều gì khác, như ngày.
  • công cụ chọn thuộc tính hàng - là một giá trị sẽ xuất hiện trong tiêu đề hàng, đây là nội dung mà mỗi hàng sẽ liên quan đến. Hãy ghi nhớ - đó là biểu hiện, không phải là đại biểu đơn giản. Chúng ta cần nó để đặt tên cột của cột đầu tiên.
  • bộ chọn dữ liệu - đây là phương pháp sẽ được chạy trên dữ liệu được nhóm cho mỗi ô. I E. trong trường hợp của bạn, chúng tôi chỉ cần chọn keyValue thuộc tính của mục đầu tiên trong nhóm. Nhưng nó có thể là các mục đếm items => items.Count() hoặc bất kỳ thứ gì khác.

Kết quả:

enter image description here


ORIGINAL ĐÁP:

Truy vấn này sẽ trở lại trục cho dữ liệu của bạn. Mỗi mục trong truy vấn sẽ có Name (tức là "Thành phố" trong ví dụ của bạn) và danh sách các giá trị - một giá trị cho mỗi cột trục (ví dụ cho mỗi ngôn ngữ chúng ta sẽ có giá trị chứa tên ngôn ngữ như ColumnValue)

var languages = Languagemaster.Select(x => x.language).Distinct(); 
var query = from r in Languagemaster 
      group r by r.keyName into nameGroup 
      select new { 
       Name = nameGroup.Key, 
       Values = from lang in languages 
         join ng in nameGroup 
           on lang equals ng.language into languageGroup 
         select new { 
          Column = lang, 
          Value = languageGroup.Any() ? 
            languageGroup.First().keyValue : null 
         } 
      }; 

Làm thế nào để xây dựng bảng dữ liệu từ truy vấn này

DataTable table = new DataTable(); 
table.Columns.Add("keyName"); // first column 
foreach (var language in languages) 
    table.Columns.Add(language); // columns for each language 

foreach (var key in query) 
{ 
    var row = table.NewRow(); 
    var items = key.Values.Select(v => v.Value).ToList(); // data for columns 
    items.Insert(0, key.Name); // data for first column 
    row.ItemArray = items.ToArray(); 
    table.Rows.Add(row); 
} 
+0

Tôi hy vọng bạn dự định chỉ sử dụng điều này cho các tập dữ liệu nhỏ. –

+0

@AlW thao tác bộ dữ liệu khổng lồ trong bộ nhớ không phải là ý tưởng rất tốt –

+1

thực sự nó là giải pháp tuyệt vời .. cảm ơn rất nhiều – user1624306

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