从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; }