我想将linq查询结果转换为datatable,以便我可以将数据表分配给GridView以在asp页面上显示它.
但是我无法将结果转换为datatable,我没有在我的代码中获取CopyToTable()方法.
请告诉我这里做错了什么?
var gradeData = (from data in oAngieCtxt.prc_ShopInstanceCustomersData(Convert.ToInt32(this.ShopInstanceID), 10000, false)
.Where( row => row.RecievedPoints != "n/a" )
.GroupBy(row => new { row.Name })
.Select(g => new GroupedPoints()
{
Name = g.Key.Name,
TotalPoints = g.Sum(x => Convert.ToDouble(x.RecievedPoints) * (x.Weightage.ToString() == "0.00" ? 1 : Convert.ToDouble(x.Weightage)))
})
select data).ToList();
DataTable dt = gradeData --gradeData.CopyToTable()
Run Code Online (Sandbox Code Playgroud)
注意:可以使用对dataextentions dll的引用.
提前致谢
首先声明一个新的 DataTable 并添加列,在此:
DataTable dt = new DataTable();
dt.Columns.Add("FirstName");
dt.Columns.Add("LastName");
DataRow row = null;
Run Code Online (Sandbox Code Playgroud)
现在我简单地遍历查询并填充一个数据表:
foreach (var rowObj in query)
{
row = dt.NewRow();
dt.Rows.Add(rowObj.FirstName, rowObj.LastName);
}
Run Code Online (Sandbox Code Playgroud)
你应该得到DataTableExtensions.CopyToDataTable
删除ToList().
CopyToDataTable是一个IEnumerable<DataRow>扩展(不幸的是).
下面有一个自定义CopyToDataTable扩展方法的解决方案.
var gradeData = (from data in oAngieCtxt.prc_ShopInstanceCustomersData(
Convert.ToInt32(this.ShopInstanceID), 10000, false)
.Where( row => row.RecievedPoints != "n/a" )
.GroupBy(row => new { row.Name })
.Select(g => new
{
Name = g.Key.Name,
TotalPoints = g.Sum(x => Convert.ToDouble(x.RecievedPoints)
* (x.Weightage.ToString() == "0.00" ? 1
: Convert.ToDouble(x.Weightage)))
})
select data);
var dt = gradeData.CopyToDataTable();
Run Code Online (Sandbox Code Playgroud)
编辑:
这是CopyToDataTable的一个更有用的实现DataRow没有类型约束.
public static class DataSetLinqOperators
{
public static DataTable CopyToDataTable<T>(this IEnumerable<T> source)
{
//you find the ObjectShredder implementation on the blog wich was linked.
return new ObjectShredder<T>().Shred(source, null, null);
}
public static DataTable CopyToDataTable<T>(this IEnumerable<T> source,
DataTable table, LoadOption? options)
{
return new ObjectShredder<T>().Shred(source, table, options);
}
}
Run Code Online (Sandbox Code Playgroud)