C# 如何连接数据表

C# 如何连接数据表,c#,linq,datatable,C#,Linq,Datatable,我正在加入datatables以创建一个新的datatable。代码如下: var row = from r0w1 in dt_vi.AsEnumerable() join r0w2 in dt_w.AsEnumerable() on r0w1.Field<int>("wcID") equals r0w2.Field<int>("iD

我正在加入datatables以创建一个新的datatable。代码如下:

var row = from r0w1 in dt_vi.AsEnumerable()
                                  join r0w2 in dt_w.AsEnumerable()
                                    on r0w1.Field<int>("wcID") equals r0w2.Field<int>("iD")
                                  join r0w3 in dt_r.AsEnumerable()
                                    on r0w1.Field<int?>("cID") equals r0w3.Field<int?>("r_id")
                                  join r0w4 in dt_d.AsEnumerable()
                                    on r0w1.Field<int?>("dftID") equals r0w4.Field<int?>("dft_id") into ps
                                  from r0w4 in ps.DefaultIfEmpty()
                                  select r0w1.ItemArray.Concat(r0w2.ItemArray.Concat(r0w3.ItemArray.Concat(r0w4 != null ? r0w4.ItemArray : new object[] { }))).ToArray();

为什么上面的代码返回null?

您可以检查它是否来自这些指令,以及Datarow r0w4是否为null吗

dftAID = r0w4.Field<string>("dftAID")
dftName = r0w4.Field<string>("dftName")
dftAID=r0w4.字段(“dftAID”)
dftName=r0w4.字段(“dftName”)
在工作代码中,您显式地检查r0w4的NOTNULL大小写

在这种情况下,您可以添加一些非空检查,如下所示:

     var row = from r0w1 in dt_vi.AsEnumerable()
        join r0w2 in dt_w.AsEnumerable()
        on r0w1.Field<int>("wcID") equals r0w2.Field<int>("iD")
        join r0w3 in dt_r.AsEnumerable()
        on r0w1.Field<int?>("cID") equals r0w3.Field<int?>("r_id")
        join r0w4 in dt_d.AsEnumerable()
        on r0w1.Field<int?>("dftID") equals r0w4.Field<int?>("dft_id") into ps
        from r0w4 in ps.DefaultIfEmpty()
        select new
        {
            cID = r0w1.Field<int?>("cID"),
            status = r0w1.Field<int?>("status"),
            defectID = r0w1.Field<int?>("dftID"),
            name = r0w2.Field<string>("name"),
            description = r0w3.Field<string>("description"),
            dftAID = r0w4 != null ? r0w4.Field<string>("dftAID") : "",
            dftName = r0w4 != null ? r0w4.Field<string>("dftName") : ""
        };

row.ToList().ForEach(q => dt.Rows.Add(q.cID, q.status, q.defectID, q.name, q.description, q.dftAID, q.dftName));
var row=从dt_vi.AsEnumerable()中的r0w1开始
将r0w2连接到dt_w.AsEnumerable()中
在r0w1.字段(“wcID”)上等于r0w2.字段(“iD”)
在dt_r.AsEnumerable()中加入r0w3
在r0w1.字段(“cID”)上等于r0w3.字段(“r_id”)
将r0w4连接到dt_d.AsEnumerable()中
在r0w1上,字段(“dftID”)等于r0w4。字段(“dft_id”)到ps
从ps.DefaultIfEmpty()中的r0w4开始
选择新的
{
cID=r0w1.字段(“cID”),
状态=r0w1.字段(“状态”),
缺陷ID=r0w1.字段(“dftID”),
name=r0w2.字段(“名称”),
description=r0w3.字段(“description”),
dftAID=r0w4!=null?r0w4.字段(“dftAID”):“”,
dftName=r0w4!=null?r0w4.字段(“dftName”):“”
};
row.ToList().ForEach(q=>dt.Rows.Add(q.cID,q.status,q.defectID,q.name,q.description,q.dftAID,q.dftName));

确保查询中的列名与表匹配。我做了一些mimor更改,使下面的代码正常工作

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            DataTable dt_vi = new DataTable();
            dt_vi.Columns.Add("wcID", typeof(int));
            dt_vi.Columns.Add("cID", typeof(int));
            dt_vi.Columns["cID"].AllowDBNull = true;
            dt_vi.Columns.Add("dftID", typeof(int));
            dt_vi.Columns["dftID"].AllowDBNull = true;
            dt_vi.Columns.Add("status", typeof(int));
            dt_vi.Columns["status"].AllowDBNull = true;

            DataTable dt_w = new DataTable();
            dt_w.Columns.Add("iD", typeof(int));
            dt_w.Columns.Add("name", typeof(string));

            DataTable dt_r = new DataTable();
            dt_r.Columns.Add("r_id", typeof(int));
            dt_r.Columns["r_id"].AllowDBNull = true;
            dt_r.Columns.Add("description", typeof(string));

            DataTable dt_d = new DataTable();
            dt_d.Columns.Add("dft_id", typeof(int));
            dt_d.Columns["dft_id"].AllowDBNull = true;
            dt_d.Columns.Add("dftAID", typeof(string));
            dt_d.Columns.Add("dftName", typeof(string));

            DataTable dt = new DataTable();
            dt.Columns.Add("qID", typeof(int));
            dt.Columns.Add("status", typeof(int));
            dt.Columns.Add("dfID", typeof(int));
            dt.Columns.Add("name", typeof(string));
            dt.Columns.Add("description", typeof(string));
            dt.Columns.Add("dftAID", typeof(string));
            dt.Columns.Add("dftName", typeof(string));


            dt_vi.Rows.Add(new object[] { 1, 1, 1, 1 });
            dt_vi.Rows.Add(new object[] { 2, 2, 2, 2 });
            dt_vi.Rows.Add(new object[] { 3, 3, 3, 3 });
            dt_vi.Rows.Add(new object[] { 4, 4, 4, 4 });
            dt_vi.Rows.Add(new object[] { 5, 5, 5, 5 });

            dt_w.Rows.Add(new object[] { 1, "a" });
            dt_w.Rows.Add(new object[] { 2, "b" });
            dt_w.Rows.Add(new object[] { 3, "c" });
            dt_w.Rows.Add(new object[] { 4, "d" });
            dt_w.Rows.Add(new object[] { 5, "e" });


            dt_r.Rows.Add(new object[] { 1, "f" });
            dt_r.Rows.Add(new object[] { 2, "g" });
            dt_r.Rows.Add(new object[] { 3, "h" });
            dt_r.Rows.Add(new object[] { 4, "i" });
            dt_r.Rows.Add(new object[] { 5, "j" });

            dt_d.Rows.Add(new object[] { 1, "k", "k" });
            dt_d.Rows.Add(new object[] { 2, "l", "l" });
            dt_d.Rows.Add(new object[] { 3, "m", "m" });
            dt_d.Rows.Add(new object[] { 4, "n", "n" });
            dt_d.Rows.Add(new object[] { 5, "o", "o" });

            var row = from r0w1 in dt_vi.AsEnumerable()
                      join r0w2 in dt_w.AsEnumerable()
                        on r0w1.Field<int>("wcID") equals r0w2.Field<int>("iD")
                      join r0w3 in dt_r.AsEnumerable()
                        on r0w1.Field<int?>("cID") equals r0w3.Field<int?>("r_id")
                      join r0w4 in dt_d.AsEnumerable()
                        on r0w1.Field<int?>("dftID") equals r0w4.Field<int?>("dft_id") into ps
                      from r0w4 in ps.DefaultIfEmpty()
                      select r0w1.ItemArray.Concat(r0w2.ItemArray.Concat(r0w3.ItemArray.Concat(r0w4 != null ? r0w4.ItemArray : new object[] { }))).ToArray();

            var rowAgain = from r0w1 in dt_vi.AsEnumerable()
                      join r0w2 in dt_w.AsEnumerable()
                        on r0w1.Field<int>("wcID") equals r0w2.Field<int>("iD")
                      join r0w3 in dt_r.AsEnumerable()
                        on r0w1.Field<int?>("cID") equals r0w3.Field<int?>("r_id")
                      join r0w4 in dt_d.AsEnumerable()
                        on r0w1.Field<int?>("dftID") equals r0w4.Field<int?>("dft_id") into ps
                      from r0w4 in ps.DefaultIfEmpty()
                      select new { 
                          cID = r0w1.Field<int?>("cID"),
                          status = r0w1.Field<int?>("status"),
                          defectID = r0w1.Field<int?>("dftID"),
                          name = r0w2.Field<string>("name"),
                          description = r0w3.Field<string>("description"),
                          dftAID = r0w4.Field<string>("dftAID"),
                          dftName = r0w4.Field<string>("dftName")
                      };

            foreach(var q in rowAgain.AsEnumerable())
            {
                dt.Rows.Add(q.cID, q.status, q.defectID, q.name, q.description, q.dftAID, q.dftName);
            }

        }
    }
}
​
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用系统数据;
命名空间控制台应用程序1
{
班级计划
{
静态void Main(字符串[]参数)
{
DataTable dt_vi=新DataTable();
添加(“wcID”,typeof(int));
添加(“cID”,类型(int));
dt_vi.列[“cID”]。AllowDBNull=true;
添加(“dftID”,typeof(int));
dt_vi.列[“dftID”]。AllowDBNull=true;
添加(“状态”,类型(int));
dt_vi.列[“状态”]。AllowDBNull=true;
DataTable dt_w=新的DataTable();
添加(“iD”,typeof(int));
添加(“名称”,类型(字符串));
DataTable dt_r=新的DataTable();
添加(“r_id”,typeof(int));
dt_r.列[“r_id”]。AllowDBNull=true;
添加(“说明”,类型(字符串));
DataTable dt_d=新的DataTable();
添加(“dft_id”,typeof(int));
dt_d.列[“dft_id”]。AllowDBNull=true;
添加(“dftAID”,typeof(string));
添加(“dftName”,typeof(string));
DataTable dt=新的DataTable();
添加(“qID”,类型(int));
添加(“状态”,类型(int));
添加(“dfID”,类型(int));
添加(“名称”,类型(字符串));
添加(“说明”,类型(字符串));
添加(“dftAID”,typeof(string));
添加(“dftName”,typeof(string));
添加(新对象[]{1,1,1,1});
添加(新对象[]{2,2,2,2});
添加(新对象[]{3,3,3,3});
添加(新对象[]{4,4,4,4});
添加(新对象[]{5,5,5});
Add(新对象[]{1,“a”});
Add(新对象[]{2,“b”});
Add(新对象[]{3,“c”});
Add(新对象[]{4,“d”});
Add(新对象[]{5,“e”});
添加(新对象[]{1,“f”});
添加(新对象[]{2,“g”});
Add(新对象[]{3,“h”});
Add(新对象[]{4,“i”});
添加(新对象[]{5,“j”});
添加(新对象[]{1,“k”,“k”});
Add(新对象[]{2,“l”,“l”});
添加(新对象[]{3,“m”,“m”});
添加(新对象[]{4,“n”,“n”});
添加(新对象[]{5,“o”,“o”});
var row=从dt_vi.AsEnumerable()中的r0w1开始
将r0w2连接到dt_w.AsEnumerable()中
在r0w1.字段(“wcID”)上等于r0w2.字段(“iD”)
在dt_r.AsEnumerable()中加入r0w3
在r0w1.字段(“cID”)上等于r0w3.字段(“r_id”)
将r0w4连接到dt_d.AsEnumerable()中
在r0w1上,字段(“dftID”)等于r0w4。字段(“dft_id”)到ps
从ps.DefaultIfEmpty()中的r0w4开始
选择r0w1.ItemArray.Concat(r0w2.ItemArray.Concat(r0w3.ItemArray.Concat(r0w4!=null?r0w4.ItemArray:new object[]{})).ToArray();
var ROWREACH=来自dt_vi.AsEnumerable()中的r0w1
将r0w2连接到dt_w.AsEnumerable()中
在r0w1.字段(“wcID”)上等于r0w2.字段(“iD”)
在dt_r.AsEnumerable()中加入r0w3
在r0w1.字段(“cID”)上等于r0w3.字段(“r_id”)
将r0w4连接到dt_d.AsEnumerable()中
在r0w1上,字段(“dftID”)等于r0w4。字段(“dft_id”)到ps
从ps.DefaultIfEmpty()中的r0w4开始
选择新{
cID=r0w1.字段(“cID”),
状态=r0w1.字段(“状态”),
缺陷ID=r0w1.字段(“dftID”),
name=r0w2.字段(“名称”),
description=r0w3.字段(“description”),
dftAID=r0w4.字段(“dftAID”),
dftName=r0w4.字段(“dftName”)
};
foreach(变量q在rowreach.AsEnumerable()中)
{
dt.行添加(q.cID、q.status、q.def
     var row = from r0w1 in dt_vi.AsEnumerable()
        join r0w2 in dt_w.AsEnumerable()
        on r0w1.Field<int>("wcID") equals r0w2.Field<int>("iD")
        join r0w3 in dt_r.AsEnumerable()
        on r0w1.Field<int?>("cID") equals r0w3.Field<int?>("r_id")
        join r0w4 in dt_d.AsEnumerable()
        on r0w1.Field<int?>("dftID") equals r0w4.Field<int?>("dft_id") into ps
        from r0w4 in ps.DefaultIfEmpty()
        select new
        {
            cID = r0w1.Field<int?>("cID"),
            status = r0w1.Field<int?>("status"),
            defectID = r0w1.Field<int?>("dftID"),
            name = r0w2.Field<string>("name"),
            description = r0w3.Field<string>("description"),
            dftAID = r0w4 != null ? r0w4.Field<string>("dftAID") : "",
            dftName = r0w4 != null ? r0w4.Field<string>("dftName") : ""
        };

row.ToList().ForEach(q => dt.Rows.Add(q.cID, q.status, q.defectID, q.name, q.description, q.dftAID, q.dftName));
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            DataTable dt_vi = new DataTable();
            dt_vi.Columns.Add("wcID", typeof(int));
            dt_vi.Columns.Add("cID", typeof(int));
            dt_vi.Columns["cID"].AllowDBNull = true;
            dt_vi.Columns.Add("dftID", typeof(int));
            dt_vi.Columns["dftID"].AllowDBNull = true;
            dt_vi.Columns.Add("status", typeof(int));
            dt_vi.Columns["status"].AllowDBNull = true;

            DataTable dt_w = new DataTable();
            dt_w.Columns.Add("iD", typeof(int));
            dt_w.Columns.Add("name", typeof(string));

            DataTable dt_r = new DataTable();
            dt_r.Columns.Add("r_id", typeof(int));
            dt_r.Columns["r_id"].AllowDBNull = true;
            dt_r.Columns.Add("description", typeof(string));

            DataTable dt_d = new DataTable();
            dt_d.Columns.Add("dft_id", typeof(int));
            dt_d.Columns["dft_id"].AllowDBNull = true;
            dt_d.Columns.Add("dftAID", typeof(string));
            dt_d.Columns.Add("dftName", typeof(string));

            DataTable dt = new DataTable();
            dt.Columns.Add("qID", typeof(int));
            dt.Columns.Add("status", typeof(int));
            dt.Columns.Add("dfID", typeof(int));
            dt.Columns.Add("name", typeof(string));
            dt.Columns.Add("description", typeof(string));
            dt.Columns.Add("dftAID", typeof(string));
            dt.Columns.Add("dftName", typeof(string));


            dt_vi.Rows.Add(new object[] { 1, 1, 1, 1 });
            dt_vi.Rows.Add(new object[] { 2, 2, 2, 2 });
            dt_vi.Rows.Add(new object[] { 3, 3, 3, 3 });
            dt_vi.Rows.Add(new object[] { 4, 4, 4, 4 });
            dt_vi.Rows.Add(new object[] { 5, 5, 5, 5 });

            dt_w.Rows.Add(new object[] { 1, "a" });
            dt_w.Rows.Add(new object[] { 2, "b" });
            dt_w.Rows.Add(new object[] { 3, "c" });
            dt_w.Rows.Add(new object[] { 4, "d" });
            dt_w.Rows.Add(new object[] { 5, "e" });


            dt_r.Rows.Add(new object[] { 1, "f" });
            dt_r.Rows.Add(new object[] { 2, "g" });
            dt_r.Rows.Add(new object[] { 3, "h" });
            dt_r.Rows.Add(new object[] { 4, "i" });
            dt_r.Rows.Add(new object[] { 5, "j" });

            dt_d.Rows.Add(new object[] { 1, "k", "k" });
            dt_d.Rows.Add(new object[] { 2, "l", "l" });
            dt_d.Rows.Add(new object[] { 3, "m", "m" });
            dt_d.Rows.Add(new object[] { 4, "n", "n" });
            dt_d.Rows.Add(new object[] { 5, "o", "o" });

            var row = from r0w1 in dt_vi.AsEnumerable()
                      join r0w2 in dt_w.AsEnumerable()
                        on r0w1.Field<int>("wcID") equals r0w2.Field<int>("iD")
                      join r0w3 in dt_r.AsEnumerable()
                        on r0w1.Field<int?>("cID") equals r0w3.Field<int?>("r_id")
                      join r0w4 in dt_d.AsEnumerable()
                        on r0w1.Field<int?>("dftID") equals r0w4.Field<int?>("dft_id") into ps
                      from r0w4 in ps.DefaultIfEmpty()
                      select r0w1.ItemArray.Concat(r0w2.ItemArray.Concat(r0w3.ItemArray.Concat(r0w4 != null ? r0w4.ItemArray : new object[] { }))).ToArray();

            var rowAgain = from r0w1 in dt_vi.AsEnumerable()
                      join r0w2 in dt_w.AsEnumerable()
                        on r0w1.Field<int>("wcID") equals r0w2.Field<int>("iD")
                      join r0w3 in dt_r.AsEnumerable()
                        on r0w1.Field<int?>("cID") equals r0w3.Field<int?>("r_id")
                      join r0w4 in dt_d.AsEnumerable()
                        on r0w1.Field<int?>("dftID") equals r0w4.Field<int?>("dft_id") into ps
                      from r0w4 in ps.DefaultIfEmpty()
                      select new { 
                          cID = r0w1.Field<int?>("cID"),
                          status = r0w1.Field<int?>("status"),
                          defectID = r0w1.Field<int?>("dftID"),
                          name = r0w2.Field<string>("name"),
                          description = r0w3.Field<string>("description"),
                          dftAID = r0w4.Field<string>("dftAID"),
                          dftName = r0w4.Field<string>("dftName")
                      };

            foreach(var q in rowAgain.AsEnumerable())
            {
                dt.Rows.Add(q.cID, q.status, q.defectID, q.name, q.description, q.dftAID, q.dftName);
            }

        }
    }
}
​