LINQ操作DataTable出現(xiàn)指定的轉(zhuǎn)換無(wú)效問(wèn)題的解決
51CTO開(kāi)發(fā)頻道向您推薦《LINQ教程-LINQ to SQL技術(shù)精解》,以便于您更好的理解這篇文章。
下面進(jìn)入正題,說(shuō)說(shuō)我在開(kāi)發(fā)過(guò)程遇到的問(wèn)題 “LINQ操作DataTable的問(wèn)題 ”。
在平時(shí)的工作中,可能有很多情況下要對(duì)DataTable的里面的數(shù)據(jù)進(jìn)行處理,最簡(jiǎn)單的例子如:對(duì)DataTable中的某個(gè)字段進(jìn)行排序,根據(jù)條件篩選DataTable中的數(shù)據(jù)。。。,例子很多,下面我們看看如何處理的:
這是我最初寫(xiě)的代碼:
代碼
- public static IEnumerable getEnumerable()
- {
- DataTable dt = getDatatable();
- try
- {
- var query = from q in dt.AsEnumerable()
- where q.Field<string>("IPLocation") == "純真網(wǎng)絡(luò) 2008年6月20日IP數(shù)據(jù)"
- 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;
- }
- }
然后我在***做數(shù)據(jù)源綁定的時(shí)候,總是報(bào)System.InvalidCastException: 指定的轉(zhuǎn)換無(wú)效的錯(cuò)誤,無(wú)論用Gridview的自動(dòng)生成列,還是Reapter的手動(dòng)添加列,都有問(wèn)題,***我查出生成的結(jié)果集就含有異常的存在,也就說(shuō)再取結(jié)果集的時(shí)候,要慎重用如下寫(xiě)法:
- 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")
我后來(lái)嘗試了另一種寫(xiě)法:
- 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()
一開(kāi)始我調(diào)試也還是報(bào)System.InvalidCastException: 指定的轉(zhuǎn)換無(wú)效這個(gè)錯(cuò)誤,我調(diào)試了一段時(shí)間,也還是有問(wèn)題,我在想是不是數(shù)據(jù)綁定控件的問(wèn)題,后來(lái)我將原來(lái)的Gridview自動(dòng)生成列換成了手動(dòng)輸入列:
代碼
- <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>
后來(lái)問(wèn)題就解決了,我現(xiàn)在也不知道這個(gè)問(wèn)題什么原因,為什么不支持自動(dòng)產(chǎn)生列呢(等待高手幫忙解決)?
知道問(wèn)題的所在了,然后就可以隨心的處理DataTable里面的數(shù)據(jù)了,如下面一個(gè)簡(jiǎn)單的小例子:
代碼
- 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;
- }
- }
當(dāng)然更復(fù)雜的對(duì)DataTable的操作這里就不在敖述了,在這里我只是說(shuō)明一下困擾我的問(wèn)題。
原文標(biāo)題:關(guān)于Linq操作DataTable的問(wèn)題
鏈接:http://www.cnblogs.com/yangtongnet/archive/2010/05/10/1731728.html
【編輯推薦】
- Linq匿名類型簡(jiǎn)單概述
- Linq隨機(jī)讀取數(shù)據(jù)淺析
- Linq Lambda表達(dá)式全面分析
- Linq擴(kuò)展方法簡(jiǎn)單分析
- 初探Linq局部變量類型