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ả:
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ư Column
và Value
)
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);
}
Nguồn
2013-07-31 14:12:08
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
vẻ giống như bạn muốn nhóm các cột theo giá trị 'keyName'. – YD1m