从linq查询中填充数据表

我使用以下代码

IEnumerable query = from c in at.appointmentcalendars.AsEnumerable() select c; DataTable dt = query.CopyToDataTable(); 

但我得到以下错误

无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'System.Collections.Generic.IEnumerable' 。 存在显式转换(您是否错过了演员?)

由于查询返回类型DataRow的IEnumerable,因此您必须指定要插入数据表的内容,在本例中为DataRow。

 DataTable dt = query.CopyToDataTable(); 

如果你用过

 var query = //linq query of what you need for new datatable.... DataTable dt = query.CopyToDataTable(); 

你的表名是dt,所以从原来的dt中选择你需要的东西

 var query = from c in db.something where c.othersomething == "onlyyouknow" orderby c.othersomething select new { NewObject = c.othersomething }; DataTable MyDataTable = new DataTable(); myDataTable.Columns.Add( new DataColumn() { DataType = System.Type.GetType("System.String"),//or other type ColumnName = "Name" //or other column name } ); foreach (var element in query) { var row = MyDataTable.NewRow(); row["Name"] = element.NewObject; myDataTable.Rows.Add(row); } 

at.appointmentcalendars不是DataTable 。 因此,您的查询返回appointmentcalendar对象的集合,这些对象无法强制转换为DataRow集合。

您需要使用MSDN文章中的CopyToDataTable方法如何:实现通用类型T不是DataRow的CopyToDataTable :

 IEnumerable query = at.appointmentcalendars.AsEnumerable(); DataTable dt = query.CopyToDataTable(); 

默认的CopyToDataTable()方法仅适用于DataRow对象的集合,因此您无法在此处使用它。

如果有人需要VB.net中的解决方案和聚合函数:

  Dim MyDataTable As DataTable = New DataTable MyDataTable.Columns.Add("ProviderName", GetType(String)) MyDataTable.Columns.Add("TotalNumSale", GetType(Integer)) MyDataTable.Columns.Add("TotalValSale", GetType(Double)) Dim testquery = (From p In adviceProductData _ Where p.IsOffPanel = False _ Group By p.ProviderName _ Into _ totalNoOfSale = Sum(p.NoOfSales), _ totalValueOfSale = Sum(p.ValueOfSales) Select New With { .ProvName = ProviderName, .TotSale = totalNoOfSale, .TotVal = totalValueOfSale }).ToList() Dim item For Each item In testquery Dim row = MyDataTable.NewRow() row("ProviderName") = item.ProvName row("TotalNumSale") = item.TotSale row("TotalValSale") = item.TotVal MyDataTable.Rows.Add(row) Next 
 DataTable getListRow(DataTable dt, int intSndBCode, int intPostManSCode) { IEnumerable results = (from MyRows in dt.AsEnumerable() where MyRows.Field("m_sndBCode") == intSndBCode && MyRows.Field("m_postManSCode") == intPostManSCode select MyRows); DataTable dtNew = results.CopyToDataTable(); return dtNew; }