最近在項目中使用了Linq,想把Linq的查詢結果直接轉換成DataTable對象,通過查找發現Linq有一個CopyToDataTable<T>的泛型方法,該方法只能在T是DataRow的情況下使用,發現了這個方法以后就直接在項目中使用了,但是在使用的過程中發現,如果Linq的查詢結果不包含任何DataRow對象的時候,使用CopyToDataTable()方法會報錯,代碼如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Configuration; 7 using System.Data; 8 using System.Data.SqlClient; 9 10 namespace CopyToDataTableDemo 11 { 12 class Program 13 { 14 static void Main(string[] args) 15 { 16 string strConn = ConfigurationManager.ConnectionStrings["AppConnection"].ConnectionString; 17 using (SqlConnection conn = new SqlConnection(strConn)) 18 { 19 string strSQL = "SELECT * FROM Product"; 20 SqlCommand cmd = new SqlCommand(strSQL, conn); 21 SqlDataAdapter adapter = new SqlDataAdapter(cmd); 22 conn.Open(); 23 try 24 { 25 DataTable dt = new DataTable(); 26 adapter.Fill(dt); 27 //CopyToDataTable() 28 DataTable dtTemp = dt.AsEnumerable().Where<DataRow>(p => 29 { 30 return p["ProductId"].ToString().Trim().Equals("4"); 31 }).CopyToDataTable(); 32 33 } 34 catch (Exception ex) 35 { 36 37 } 38 finally 39 { 40 conn.Close(); 41 } 42 } 43 } 44 } 45 }
報錯信息如下:
該錯誤信息說明如果Linq的查詢結果不包含任何DataRow對象的時候,使用該方法會報錯,那么怎么將Linq的查詢結果轉換成DataTable使用呢?
繼續查詢Linq的方法,發現Linq還有一個ToList()的方法,使用該方法可以解決Linq查詢結果不包含任何DataRow對象時報錯的問題,代碼修改如下:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Threading.Tasks; 6 using System.Configuration; 7 using System.Data; 8 using System.Data.SqlClient; 9 10 namespace CopyToDataTableDemo 11 { 12 class Program 13 { 14 static void Main(string[] args) 15 { 16 string strConn = ConfigurationManager.ConnectionStrings["AppConnection"].ConnectionString; 17 using (SqlConnection conn = new SqlConnection(strConn)) 18 { 19 string strSQL = "SELECT * FROM Product"; 20 SqlCommand cmd = new SqlCommand(strSQL, conn); 21 SqlDataAdapter adapter = new SqlDataAdapter(cmd); 22 conn.Open(); 23 try 24 { 25 DataTable dt = new DataTable(); 26 adapter.Fill(dt); 27 //CopyToDataTable() 28 // 當LINQ的查詢結果不包含任何DataRow對象的時候會報錯 29 //DataTable dtTemp = dt.AsEnumerable().Where<DataRow>(p => 30 //{ 31 // return p["ProductId"].ToString().Trim().Equals("4"); 32 //}).CopyToDataTable(); 33 34 //ToList() 35 List<DataRow> list = dt.AsEnumerable().Where<DataRow>(p => 36 { 37 return p["ProductId"].ToString().Trim().Equals("4"); 38 }).ToList(); 39 if (list.Count > 0) 40 { 41 DataTable dtTemp = dt.Clone(); 42 // 循環遍歷list轉換成DataTable 43 list.ForEach(p => 44 { 45 dtTemp.Rows.Add(p.ItemArray); 46 }); 47 } 48 49 } 50 catch (Exception ex) 51 { 52 53 } 54 finally 55 { 56 conn.Close(); 57 } 58 } 59 } 60 } 61 }
使用ToList()方法就可以解決該報錯問題了。