http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 14239|回复: 8

[其他] 根据datatable中一列值筛选datatable生成一个新的

[复制链接]
发表于 2013-6-21 14:57:57 | 显示全部楼层 |阅读模式
本帖最后由 中国人 于 2013-6-21 17:01 编辑

1,主要是筛选,不想一行一行 循环,看有没有简单点的。dt1表为
1SMTDQIQY6DC230008H0J1DCK1B
4
1SMTDQIQY6DC232002E0J1DSG1B
4
1SMTDQIQY6DC23300CI0J1DSG1B
8
1SMTDQIQY6DC23300CK0J1DCI2B
4
1SMTDQIQY6DC234007T0J1DCI2B
4
1SMTDQIQY6ES00000060J1DCK1B
8
1SMTDQIQY6SA00000L80J1DSE2B
4
1SMTDQIQY6SA00000OH0J1DSA1B
2
1SMTDQIQY6SA00000OH0J1DSA2B
2
dt2 为
DC230008H0J1DCK1B
DC232002E0J1DSG1B
DC23300CI0J1DSG1B
DC23300CK0J1DCI2B
DC234007T0J1DCI2B
ES00000060J1DCK1B
如何使用linq,筛选出dt1中dt2.column[0] 中 出现的资料。可不可以不使用循环实现。




1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-6-21 15:16:43 | 显示全部楼层
你是不是要根据dt2中的SA00000OH0J这样数据的那个列,查询出来在这个表中对应的数据行啊,
这个就一个Sql语句就行了
假如这个列在表中的名字是c3
SELECT * FROM dt1 WHERE c3 IN(SELECT c3 FROM dt2)
这样就行了
 楼主| 发表于 2013-6-21 15:24:56 | 显示全部楼层
在SQL 中是这么实现的。现在使用C# 获得了dt1,和dt2 。根据dt2 中一列值 筛选出dt1 中符合 的行。
发表于 2013-6-21 15:37:07 | 显示全部楼层
C# 里不是有Dataset吗?可以把表放到Dataset里再进行处理
如下
[code=csharp]   DataSet ds = null;

            DataRow dr = ds.Tables[1].Select().SingleOrDefault(s => s["c3"].ToString() =="值,这个条件可以不写就是所有的,");

            DataRow[] result = ds.Tables[0].Select().Where(s => s["c3"].ToString() == dr["c3"].ToString()).ToArray();[/code]
 楼主| 发表于 2013-6-21 15:59:56 | 显示全部楼层
受教了。引入linq 可以。但是 s => s["c3"].ToString() 这个为什么报错,说无法将string转换为bool
发表于 2013-6-21 16:11:29 | 显示全部楼层
s => s["c3"].ToString() =="值,这个条件可以不写就是所有的,"
后面部分没有加吧,
 楼主| 发表于 2013-6-21 16:23:19 | 显示全部楼层
本帖最后由 中国人 于 2013-6-21 16:42 编辑

OK,收到了。谢谢。了解了。现在继续进行中。非常感谢。不过为什么会返回null 而不是预想中的一列值。要是能返回
DC230008H0J
DC232002E0J
DC23300CI0J
DC23300CK0J
DC234007T0J
ES00000060J
SA00000L80J
SA00000OH0J
SA00000OH0J
SA000028N0J
SA00002921J
SA00002XR0J
SA00003FO30
SA00003K30J
这样的对象才对吧。
 楼主| 发表于 2013-6-21 17:00:08 | 显示全部楼层
学到了很多东西,还是重新整理下   问题思路。希望可以得到完整答案。
 楼主| 发表于 2013-6-22 10:56:22 | 显示全部楼层
站长苏飞 发表于 2013-6-21 16:11
s => s["c3"].ToString() =="值,这个条件可以不写就是所有的,"
后面部分没有加吧,

问题解决了。最终代码是这样,也开了另一个探究LINQ 的帖子,怎么变更为 已完成?
  1. dtDiffLineNoCommonUse = dasF.Tables[0].Clone();<span style="color:green;">//克隆表结构</span>

  2.                             <span style="color:#2b91af;">DataTable</span> dtF = dasF.Tables[0];
  3.                             <span style="color:#2b91af;">DataTable</span> dtT = dasT.Tables[0];

  4.                             <span style="color:blue;">var</span> query1 = <span style="color:blue;">from</span> e2 <span style="color:blue;">in</span> dtT.AsEnumerable()
  5.                                          <span style="color:blue;">select</span> e2.Field<<span style="color:blue;">string</span>>(<span style="color:#a31515;">"PART_NO"</span>);

  6.                             <span style="color:blue;">var</span> query = <span style="color:blue;">from</span> e1 <span style="color:blue;">in</span> dtF.AsEnumerable()
  7.                                         <span style="color:blue;">where</span> !(query1).Contains(e1.Field<<span style="color:blue;">string</span>>(<span style="color:#a31515;">"RAW_PN"</span>))
  8.                                         <span style="color:green;">//join e2 in dtT.AsEnumerable() on e1.Field<string>("RAW_PN") equals e2.Field<string>("PART_NO")</span>
  9.                                         <span style="color:blue;">select</span> e1;

  10.                             <span style="color:blue;">foreach</span> (<span style="color:blue;">var</span> r <span style="color:blue;">in</span> query)
  11.                             {
  12.                                 dtDiffLineNoCommonUse.Rows.Add(r.ItemArray);
  13.                             }
复制代码
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-11-22 18:07

© 2014-2021

快速回复 返回顶部 返回列表