以下代码示例来自MSDN here。我没有在我的代码中获得query.CopyToDataTable()。 (请参阅以下代码中的注释行)。
public static bool SetPhysicianAsNotonServer(DataTable dt)
{
DataTable dtPhysicianServer = dt;
DataTable dtPhysicianClient = GetPhysicianClient();
var query =
from SPhysician in dtPhysicianServer.AsEnumerable()
join CPhysician in dtPhysicianClient.AsEnumerable()
on SPhysician.Field<string>("PhysicianNumber") equals
CPhysician.Field<string>("PhysicianNumber")
select new
{
PhysicianNumber = CPhysician.Field<string>("PhysicianNumber")
};
DataTable FilterDt = query; //query.CopyToDataTable();
//YET TO DO CODE HERE
return true;
}
答案 0 :(得分:21)
您的select语句返回一系列字符串(IEnumerable<string>
或IQueryable<string>
),而不是一系列DataRows。 CopyToDataTable()仅适用于IEnumerable<T>
,其中T是或来自DataRow。
而不是select new { ... }
- 只会为您提供该类型的新序列,请尝试:
select CPhysician;
哪个应该返回所需的CPhysician行序列。
修改强> 如果您希望将非数据表导出的T转换为数据表,MSDN有一个反映任何类型并执行转换的示例类。
答案 1 :(得分:7)
它存在于特定的命名空间中,你导入它吗?
System.Data.DataTableExtensions.CopyToDataTable()
同时确认添加此参考
System.Data.DataSetExtensions
答案 2 :(得分:4)
我认为这是因为您创建了一个匿名类型来保存Field
对象。
试试这个:
var query = from SPhysician in dtPhysicianServer.AsEnumerable()
join CPhysician in dtPhysicianClient.AsEnumerable()
on SPhysician.Field<string>("PhysicianNumber") equals
CPhysician.Field<string>("PhysicianNumber")
select CPhysician;
DataTable FilterDt = query.CopyToDataTable();
CopyToDataTable<T>
的定义:
public static DataTable CopyToDataTable<T>(
this IEnumerable<T> source
)
where T : DataRow
因此,您使用查询选择的内容必须是IEnumerable<T>
类型T
扩展DataRow
答案 3 :(得分:2)
您需要引用System.Data.DataSetExtensions
程序集并使用System.Data
命名空间。
答案 4 :(得分:0)
您是否引用了System.Data.DataSetExtensions程序集?这个扩展方法在那里定义。
答案 5 :(得分:0)
在线进一步导航到MSDN会带我到这个页面:http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.aspx
它在System.Data命名空间(使用System.Data)中说它,你需要引用System.Data.DataSetExtensions.dll。
答案 6 :(得分:0)
对我来说,此问题是由使用Dotnet Core 2.0引起的,它在转换后似乎无法将IEnumerable
转换为DataTable
。
只需将它添加到遇到相同问题的任何人。