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
【编辑推荐】