使用空对象连接c#中的datatable

使用空对象连接c#中的datatable,c#,sql,linq,C#,Sql,Linq,您好,当记录中有空值时,连接表时出现问题 有两个数据表: 工人:(工人ID、工人名称、工人服装) 事务:(transactionID、TransactionInvalue、worker1、worker2),其中worker 2是可选的,因此它可以包含空值 所以我开始编写如下代码: var record = from transaction in dtTransactions.AsEnumerable() join worker1 in dtWorkers.AsEnumerable() o

您好,当记录中有空值时,连接表时出现问题

有两个数据表:

  • 工人:(工人ID、工人名称、工人服装)
  • 事务:(transactionID、TransactionInvalue、worker1、worker2),其中worker 2是可选的,因此它可以包含空值
  • 所以我开始编写如下代码:

    var record = from transaction in dtTransactions.AsEnumerable()
        join worker1 in dtWorkers.AsEnumerable() on (int)transactions["worker1"] equals (int)worker1["workerID"]
        join worker2 in dtWorkers.AsEnumerable() on (int)transactions["worker2"] equals (int)worker2["workerID"]
        select new
        {
         ID = (int)transactions["transactionID"],
         Name1= worker1["workerName"],
         Name2= worker2["workerName"]
        };
    
    所以,如果worker2不是null,那么一切都很好,但是当我有一个null值时,它就不能被连接。有人能帮我解决这个问题吗?如果dataTable中的结果记录为空,我希望它没有worker2名称


    可能吗

    您需要这样做一个左连接

    var record = from transaction in dtTransactions.AsEnumerable()
                         join worker1 in dtWorkers.AsEnumerable() on (int)transactions["worker1"] equals (int)worker1["workerID"]
                         join worker2 in dtWorkers.AsEnumerable() on (int)transactions["worker2"] equals (int)worker2["workerID"] into w2
                         from wrk in w2.DefaultIfEmpty()
                         select new
                         {
                             ID = (int)transactions["transactionID"],
                             Name1= worker1["workerName"],
                             Name2= wrk["workerName"]
                         };
    
    第二,你为什么不这样指定对象属性

                    var record = from transaction in dtTransactions.AsEnumerable()
                     join worker1 in dtWorkers.AsEnumerable() on (int)transactions.worker1 equals (int)worker1.workerID
                     join worker2 in dtWorkers.AsEnumerable() on (int)transactions.worker2 equals (int)worker2.workerID into w2
                     from wrk in w2.DefaultIfEmpty()
                     select new
                     {
                         ID = (int)transactions.transactionID,
                         Name1= worker1.workerName,
                         Name2= wrk != null ? wrk.workerName : ""
                     };
    

    注意方括号的移除

    您需要这样做一个左连接

    var record = from transaction in dtTransactions.AsEnumerable()
                         join worker1 in dtWorkers.AsEnumerable() on (int)transactions["worker1"] equals (int)worker1["workerID"]
                         join worker2 in dtWorkers.AsEnumerable() on (int)transactions["worker2"] equals (int)worker2["workerID"] into w2
                         from wrk in w2.DefaultIfEmpty()
                         select new
                         {
                             ID = (int)transactions["transactionID"],
                             Name1= worker1["workerName"],
                             Name2= wrk["workerName"]
                         };
    
    from x in left
    where x.Id != null
    join y in right on x.Id equals y.Id into rightMatches
    from y2 in rightMatches.DefaultIfEmpty() 
    select new {x, y2};
    
    第二,你为什么不这样指定对象属性

                    var record = from transaction in dtTransactions.AsEnumerable()
                     join worker1 in dtWorkers.AsEnumerable() on (int)transactions.worker1 equals (int)worker1.workerID
                     join worker2 in dtWorkers.AsEnumerable() on (int)transactions.worker2 equals (int)worker2.workerID into w2
                     from wrk in w2.DefaultIfEmpty()
                     select new
                     {
                         ID = (int)transactions.transactionID,
                         Name1= worker1.workerName,
                         Name2= wrk != null ? wrk.workerName : ""
                     };
    

    注意去掉方括号

    好的,看起来不错,但我仍然有一些问题。当我启动一个程序时,我在(int)事务[“worker2”]上得到一个强制转换异常,可能是因为该字段中的空值,所以我尝试删除(int)强制转换。之后,我在代码的select new{..}部分中得到了空值异常。:/我遗漏了什么吗?名字的类型是什么?请参阅我的编辑我在指定Name2值时编辑了代码,如果它是字符串,这将起作用。很好:D那正是我要找的D非常感谢!:)好的,这看起来不错,但我仍然有一些问题。当我启动一个程序时,我在(int)事务[“worker2”]上得到一个强制转换异常,可能是因为该字段中的空值,所以我尝试删除(int)强制转换。之后,我在代码的select new{..}部分中得到了空值异常。:/我遗漏了什么吗?名字的类型是什么?请参阅我的编辑我在指定Name2值时编辑了代码,如果它是字符串,这将起作用。很好:D那正是我要找的D非常感谢!:)
    from x in left
    where x.Id != null
    join y in right on x.Id equals y.Id into rightMatches
    from y2 in rightMatches.DefaultIfEmpty() 
    select new {x, y2};