使用空对象连接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
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};