1

您好,当我在记录中有空值时,我在加入表时遇到问题。

有2个数据表:

  1. 工人:(工人ID,工人姓名,工人地址)
  2. Transactions: (transactionID, transactioinValue, 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 不为空,则一切正常,但是当我有空值时,它无法加入。有人可以帮我解决这个问题吗,如果 dataTable 中为 null,我希望有一个没有 worker2 名称的结果记录。

是否可以?

4

2 回答 2

1

你需要像这样进行左连接;

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 : ""
                 };

注意去掉方括号

于 2012-08-28T11:03:13.970 回答
0
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};
于 2012-08-28T11:04:28.603 回答