C#中请问dt.AsEnumerable().Join参数格式?

PCCYC 2017-08-02 10:54:38
.net中linq语句有多种写法。
小弟最近遇到一个问题就是两个DataTable关联,
目前使用的关联查询语句是网上常见的一种,如下:

from t1 in dsOrder.Tables[0].AsEnumerable()
from t2 in dsOrderDay.Tables[0].AsEnumerable()
where t1.Field<string>("OrderNo") == t2.Field<string>("OrderNo")
select.....


但是小弟平常习惯用 dsOrder.Tables[0].AsEnumerable().join方式写 linq语句,可是我发现到Join这里就不会写了,网上找了半天没看到这种写法的样例。
请教如果这样写,怎么把第二个dt表带进去? 非常感谢。

...全文
2382 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
PCCYC 2017-09-05
  • 打赏
  • 举报
回复
谢谢各位,明白了。
cxmcxm 2017-08-28
  • 打赏
  • 举报
回复

var query=dsOrder.Tables[0].AsEnumerable().Join(
                dsOrderDay.Tables[0].AsEnumerable(),
                m => { return m.Field<string>("OrderNo"); },
                n => { return n.Field<string>("OrderNo"); },
                (m, n) => new  {  //这里就放要select 的字段 如  orderno=m.Field<string>("OrderNo");                });

最好用from select 的方式,创造出linq查询就是为了方便,.join,..any...等方法是用来给机器用的中间语言,虽然我们也可直接用,但并不符合人脑的思维方式,所以感觉更麻烦。
正怒月神 2017-08-02
  • 打赏
  • 举报
回复
var sg = db.Users.Join(db.Departments, u => u.DepartmentId, d => d.DepartmentId, (u,d) => new { u, d }).Select(o=>o).ToList();
巴士上的邂逅 2017-08-02
  • 打赏
  • 举报
回复
上边不是把dt1和dt2join一块了?
PCCYC 2017-08-02
  • 打赏
  • 举报
回复
引用 4 楼 yuankaiwsl 的回复:
要返回什么类型?
随便返回。
PCCYC 2017-08-02
  • 打赏
  • 举报
回复
引用 1 楼 duanzi_peng 的回复:
没有join。 两个from 就表示join
引用 1 楼 duanzi_peng 的回复:
没有join。 两个from 就表示join
我这里主要是想问格式问题, 用"."的方式怎么把另外一个DT表带进来。 或者说 AsEnumerable().Join()怎么用?
巴士上的邂逅 2017-08-02
  • 打赏
  • 举报
回复
要返回什么类型?
PCCYC 2017-08-02
  • 打赏
  • 举报
回复
引用 2 楼 yuankaiwsl 的回复:
应该是这样吧
dt1.AsEnumerable().Join(dt2.AsEnumerable(), r => r.Field<string>("OrderNo"), r => r.Field<string>("OrderNo"), (r, r1) => r);
这个我在CSDN上看到了一个,但是不对。
巴士上的邂逅 2017-08-02
  • 打赏
  • 举报
回复
应该是这样吧
dt1.AsEnumerable().Join(dt2.AsEnumerable(), r => r.Field<string>("OrderNo"), r => r.Field<string>("OrderNo"), (r, r1) => r);
exception92 2017-08-02
  • 打赏
  • 举报
回复
没有join。 两个from 就表示join
PCCYC 2017-08-02
  • 打赏
  • 举报
回复
引用 12 楼 duanzi_peng 的回复:
[quote=引用 11 楼 codeck 的回复:] 参考你的我改成:

         dsOrder.Tables[0].AsEnumerable().Join(
                dsOrderDay.Tables[0].AsEnumerable(),
                m => { return m.Field<string>("OrderNo"); },
                n => { return n.Field<string>("OrderNo"); },
                (m, n) => { return m.Field<string>("OrderNo")== n.Field<string>("OrderNo"); }).Select(obj=> new { });
有点不对劲,到Select后Obj变成布尔类型了,其实我就是想Join后,OrderNo等于OrderNo, 再将两个对象传到Select进行列删选。
传不进去,也没必要传。 第三个参数中的m,n 就分别表示你的dsOrder.Tables[0] 与 dsOrderDay.Tables[0],这个都可以满足需求了。[/quote] 这就晕了,那 m => { return m.Field<string>("OrderNo"); },n => { return n.Field<string>("OrderNo"); }, 这种写法没意义啊,重复啰嗦还有歧义,觉得这不符合逻辑,但不填又会报错。
巴士上的邂逅 2017-08-02
  • 打赏
  • 举报
回复
2#不可以吗? 给你改成你能直接用的代码
dsOrder.Tables[0].AsEnumerable().Join(dsOrderDay.Tables[0].AsEnumerable(),r => r.Field<string>("OrderNo"), r => r.Field<string>("OrderNo"), (r, r1) => r);
exception92 2017-08-02
  • 打赏
  • 举报
回复
引用 11 楼 codeck 的回复:
参考你的我改成:

         dsOrder.Tables[0].AsEnumerable().Join(
                dsOrderDay.Tables[0].AsEnumerable(),
                m => { return m.Field<string>("OrderNo"); },
                n => { return n.Field<string>("OrderNo"); },
                (m, n) => { return m.Field<string>("OrderNo")== n.Field<string>("OrderNo"); }).Select(obj=> new { });
有点不对劲,到Select后Obj变成布尔类型了,其实我就是想Join后,OrderNo等于OrderNo, 再将两个对象传到Select进行列删选。
传不进去,也没必要传。 第三个参数中的m,n 就分别表示你的dsOrder.Tables[0] 与 dsOrderDay.Tables[0],这个都可以满足需求了。
PCCYC 2017-08-02
  • 打赏
  • 举报
回复
引用 10 楼 duanzi_peng 的回复:
[quote=引用 9 楼 duanzi_peng 的回复:] [quote=引用 5 楼 codeck 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:] 没有join。 两个from 就表示join
引用 1 楼 duanzi_peng 的回复:
没有join。 两个from 就表示join
我这里主要是想问格式问题, 用"."的方式怎么把另外一个DT表带进来。 或者说 AsEnumerable().Join()怎么用? [/quote] 抱歉是有join关键字的,下边的代码是对比第一列的数据是否相同:

var result = Enumerable.Join(dt1.AsEnumerable(), dt2.AsEnumerable(), (row) => { return ""; }, (row) => { return ""; }, (m, n) =>
              {
                  if (m[0].ToString() == n[0].ToString())
                  {
                      return true;
                  }
                  return false;
              });
[/quote] 或者:

var result = dt1.AsEnumerable().Join(dt2.AsEnumerable(), (row) =>
            { return ""; }, (row) => { return ""; }, (m, n) =>
              {
                  return new
                  {
                      dt1Col1 = m[0].ToString(),
                      dt1Col2 = m[1].ToString(),
                      dt2Col1 = n[0].ToString(),
                      dt2Col2 = n[1].ToString()
                  };
              });
[/quote] 参考你的我改成:

         dsOrder.Tables[0].AsEnumerable().Join(
                dsOrderDay.Tables[0].AsEnumerable(),
                m => { return m.Field<string>("OrderNo"); },
                n => { return n.Field<string>("OrderNo"); },
                (m, n) => { return m.Field<string>("OrderNo")== n.Field<string>("OrderNo"); }).Select(obj=> new { });
有点不对劲,到Select后Obj变成布尔类型了,其实我就是想Join后,OrderNo等于OrderNo, 再将两个对象传到Select进行列删选。
exception92 2017-08-02
  • 打赏
  • 举报
回复
引用 9 楼 duanzi_peng 的回复:
[quote=引用 5 楼 codeck 的回复:] [quote=引用 1 楼 duanzi_peng 的回复:] 没有join。 两个from 就表示join
引用 1 楼 duanzi_peng 的回复:
没有join。 两个from 就表示join
我这里主要是想问格式问题, 用"."的方式怎么把另外一个DT表带进来。 或者说 AsEnumerable().Join()怎么用? [/quote] 抱歉是有join关键字的,下边的代码是对比第一列的数据是否相同:

var result = Enumerable.Join(dt1.AsEnumerable(), dt2.AsEnumerable(), (row) => { return ""; }, (row) => { return ""; }, (m, n) =>
              {
                  if (m[0].ToString() == n[0].ToString())
                  {
                      return true;
                  }
                  return false;
              });
[/quote] 或者:

var result = dt1.AsEnumerable().Join(dt2.AsEnumerable(), (row) =>
            { return ""; }, (row) => { return ""; }, (m, n) =>
              {
                  return new
                  {
                      dt1Col1 = m[0].ToString(),
                      dt1Col2 = m[1].ToString(),
                      dt2Col1 = n[0].ToString(),
                      dt2Col2 = n[1].ToString()
                  };
              });
exception92 2017-08-02
  • 打赏
  • 举报
回复
引用 5 楼 codeck 的回复:
[quote=引用 1 楼 duanzi_peng 的回复:] 没有join。 两个from 就表示join
引用 1 楼 duanzi_peng 的回复:
没有join。 两个from 就表示join
我这里主要是想问格式问题, 用"."的方式怎么把另外一个DT表带进来。 或者说 AsEnumerable().Join()怎么用? [/quote] 抱歉是有join关键字的,下边的代码是对比第一列的数据是否相同:

var result = Enumerable.Join(dt1.AsEnumerable(), dt2.AsEnumerable(), (row) => { return ""; }, (row) => { return ""; }, (m, n) =>
              {
                  if (m[0].ToString() == n[0].ToString())
                  {
                      return true;
                  }
                  return false;
              });

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧