LINQ操作DataTable出現指定的轉換無效問題的解決
51CTO開發頻道向您推薦《LINQ教程-LINQ to SQL技術精解》,以便于您更好的理解這篇文章。
下面進入正題,說說我在開發過程遇到的問題 “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") == "純真網絡 2008年6月20日IP數據"
- 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的操作這里就不在敖述了,在這里我只是說明一下困擾我的問題。
原文標題:關于Linq操作DataTable的問題
鏈接:http://www.cnblogs.com/yangtongnet/archive/2010/05/10/1731728.html
【編輯推薦】