为什么我没有在Linq Query()中获得.CopyToDataTable()

下面的代码示例来自MSDN。 我没有在我的代码中获得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("PhysicianNumber") equals CPhysician.Field("PhysicianNumber") select new { PhysicianNumber = CPhysician.Field("PhysicianNumber") }; DataTable FilterDt = query; //query.CopyToDataTable(); //YET TO DO CODE HERE return true; } 

您的select语句返回一个字符串序列( IEnumerableIQueryable ),而不是一系列DataRows。 CopyToDataTable()仅在IEnumerable上可用,其中T是或者是从DataRow派生的。

不要select new { ... } – 这将只为您提供该类型的新序列,请尝试:

 select CPhysician; 

哪个应该返回所需的CPhysician行序列。

编辑如果您希望将非数据表导出的T转换为数据表,MSDN有一个反映任何类型并执行转换的示例类。

http://msdn.microsoft.com/en-us/library/bb669096.aspx

它存在于特定的命名空间中,您导入它吗?

 System.Data.DataTableExtensions.CopyToDataTable() 

同时确认添加此参考

 System.Data.DataSetExtensions 

我认为那是因为你创建了一个匿名类型来保存Field对象。 试试这个:

  var query = from SPhysician in dtPhysicianServer.AsEnumerable() join CPhysician in dtPhysicianClient.AsEnumerable() on SPhysician.Field("PhysicianNumber") equals CPhysician.Field("PhysicianNumber") select CPhysician; DataTable FilterDt = query.CopyToDataTable(); 

CopyToDataTable定义:

 public static DataTable CopyToDataTable( this IEnumerable source ) where T : DataRow 

因此,您使用查询选择的内容必须是IEnumerable类型,其中T扩展DataRow

您需要引用System.Data.DataSetExtensions程序集并使用System.Data命名空间。

您是否引用了System.Data.DataSetExtensions程序集? 这里定义了这种扩展方法。

进一步导航到MSDN在线将我带到这个页面: http : //msdn.microsoft.com/en-us/library/system.data.datatableextensions.aspx

它说它在System.Data命名空间(使用System.Data),你需要引用System.Data.DataSetExtensions.dll。