c# Linq操作DataTable

在平時的工作中,可能有很多情況下要對DataTable的裏面的數據進行處理,最簡單的例子如:對DataTable中的某個字段進行排序,根據條件篩選DataTable中的數據。。。,例子很多,下面我們看看如何處理的:

     這是我最初寫的代碼:

     

代碼
 public static IEnumerable getEnumerable() 
 {
  DataTable dt 
= getDatatable();
  
try
  {
   var query 
= from q in dt.AsEnumerable()
   
where q.Field<string>("IPLocation"== "北京"
   select 
new
   {
   IPid 
= q.Field<int>("IPid"),
   IPFrom 
= q.Field<string>("IPFrom"),
   IPTo 
= q.Field<string>("IPTo"),
   IPCity 
= q.Field<string>("IPCity"),
   IPToNumber 
= q.Field<string>("IPToNumber"),
   IPFromNumber 
= q.Field<string>("IPFromNumber")
   };
   
return query;
   }
   
catch
   {
      
return null;
            }
 }

 

 

     然後我在最後做數據源綁定的時候,總是報System.InvalidCastException: 指定的轉換無效的錯誤,無論用Gridview的自動生成列,還是Reapter的手動添加列,都有問題,最後我查出生成的結果集就含有異常的存在,也就說再取結果集的時候,要慎重用如下寫法:

       IPid = q.Field<int>("IPid"),

       IPFrom = q.Field<string>("IPFrom"),

       IPTo = q.Field<string>("IPTo"),

       IPCity = q.Field<string>("IPCity"),

       IPToNumber = q.Field<string>("IPToNumber"),

       IPFromNumber = q.Field<string>("IPFromNumber")

 我後來嘗試了另一種寫法:

       IPid = q["IPid"].ToString(),

       IPFrom = q["IPFrom"].ToString(),

       IPTo = q["IPTo"].ToString(),

       IPLocation = q["IPLocation"].ToString(),

       IPCity = q["IPCity"].ToString(),

       IPToNumber = q["IPToNumber"].ToString(),

       IPFromNumber = q["IPFromNumber"].ToString() 

      一開始我調試也還是報System.InvalidCastException: 指定的轉換無效這個錯誤,我調試了一段時間,也還是有問題,我在想是不是數據綁定控件的問題,後來我將原來的Gridview自動生成列換成了手動輸入列:

        

 

代碼
<table  align="center" width="100%" cellpadding="0" cellspacing="0" style="border: Gray 1px solid; margin-top:5px; margin-bottom:10px">
        
<asp:Repeater ID="rpTest" runat="server">
        
<HeaderTemplate>
          
<tr>
             
<th style=" background-color:Gray; color:White;border: Gray 1px solid;text-align:center">ID</th>
             
<th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPFrom</th>
             
<th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPTo</th>
             
<th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPLocation</th>
             
<th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">City</th>
             
<th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPToNumber</th>
             
<th style=" background-color:Black; color:White;border: Gray 1px solid;text-align:center">IPFromNumber</th>
          
</tr>
        
</HeaderTemplate>
           
<ItemTemplate>
              
<tr>
                
<td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPid")%></td>
                
<td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPFrom")%></td> 
                
<td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPTo")%></td> 
                
<td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPLocation")%></td>
                
<td style="border: Gray 1px solid;text-align:center;">
                   
<%#Eval("IPCity"%>
                
</td>  
                
<td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPToNumber")%></td>  
                
<td style="border: Gray 1px solid;text-align:center;"><%#Eval("IPFromNumber")%></td>
                           
             
</tr>
           
</ItemTemplate>
        
</asp:Repeater>
      
</table>

 

 

 

      後來問題就解決了,我現在也不知道這個問題什麼原因,爲什麼不支持自動產生列呢(等待高手幫忙解決)?

      知道問題的所在了,然後就可以隨心的處理DataTable裏面的數據了,如下面一個簡單的小例子:

      

 

代碼
public static IEnumerable getEnumerable()
        {
            DataTable dt 
= getDatatable();
            
try
            {
                var query 
= from q in dt.AsEnumerable()
                            orderby 
long.Parse(q["IPid"].ToString()) descending
                            
where q["IPid"].ToString() == "345058"
                            select 
new
                            {
                                IPid 
= q["IPid"].ToString(),
                                IPFrom 
= q["IPFrom"].ToString(),
                                IPTo 
= q["IPTo"].ToString(),
                                IPLocation 
= q["IPLocation"].ToString(),
                                IPCity 
= q["IPCity"].ToString(),
                                IPToNumber 
= q["IPToNumber"].ToString(),
                                IPFromNumber 
= q["IPFromNumber"].ToString()
                            };
                
return query;
                
//List<IPInfo> list = new List<IPInfo>();
                
//foreach (var q in query)
                
//{
                
//    IPInfo model = new IPInfo();
                
//    model.IPCity = q.IPCity;
                
//    model.IPFrom = q.IPFrom;
                
//    model.IPFromNumber = q.IPFromNumber;
                
//    model.IPid = long.Parse(q.IPid);
                
//    model.IPLocation = q.IPLocation;
                
//    model.IPTo = q.IPTo;
                
//    model.IPToNumber = q.IPToNumber;
                
//    list.Add(model);
                
//}
                
//return list;
            }
            
catch
            {
                
return null;
            }
        }

 

      當然更復雜的對DataTable的操作這裏就不在敖述了,在這裏我只是說明一下困擾我的問題。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章