我有以下课程;
public static class statiClass
{
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;
}
我不能从另一个像下面这样的班级打电话给他;
dtTA.ToPivotTable(
item => item.Year,
item => item.Product,
items => items.Any() ? items.Sum(x => x.Sales) : 0);
它会引发类似;
的错误DataTable' does not contain a definition for 'ToPivotTable' and no accessible extension method 'ToPivotTable'
我搜索了很多,却没有找到有趣的解决方案。
我该如何解决?
答案 0 :(得分:2)
您在IEnumerable
界面中注册扩展方法(由方法定义中的以下参数指示:this IEnumerable<T> source
),而(根据错误消息判断)尝试从{{1 }}实例。仅仅因为DataTable
未实现DataTable
(source)而出现错误。只需将IEnumerable
替换为IEnumerable
或DataTable
类实现的其他接口,使您的方法适应这些更改,该方法就可以正常工作。
答案 1 :(得分:2)
首先将dtTA转换为IEnumerable源 然后,您可以按来源调用ToPivotTable 像下面这样(对我们很有帮助):
//first convert dtTA to IEnumerable source
var source = dtTA
.Select()
.Select(x => new
{
Year = (string)x["Year"],
Product = (string)x["Product"],
Sales = (int)x["Sales"]
}).ToList();
//then , you can call ToPivotTable by source
source.ToPivotTable(
item => item.Year,
item => item.Product,
items => items.Any() ? items.Sum(x => x.Sales) : 0);
答案 2 :(得分:0)
不是通过AsEnumerable
方法将DataTable转换为IEnumerable吗?
我想念什么吗?
dtTA.AsEnumerable().ToPivotTable(
item => item.Year,
item => item.Product,
items => items.Any() ? items.Sum(x => x.Sales) : 0);