实际上有一种方法可以做到这一点,前提是您的表之间的关系是 1 比 1(尽管缺少行不是一个大问题):创建两个关系而不是一个,即
var joinColT1 = table1.Columns["ID"];
var joinColT2 = table2.Columns["FK_IDT1"];
var rel1 = new DataRelation("R1To2", joinColT1, joinColT2, false);
var rel2 = new DataRelation("R2To1", joinColT2, joinColT1, false);
theDataSet.Relations.Add(rel1);
theDataSet.Relations.Add(rel2);
// Add the column you're after
var hisFriend = new DataColumn("HisFriend", typeof(string), "Parent([R2To1]).[HisFriend]");
table1.Columns.Add(hisFriend);
// Add a back-reference to the other table against the friend if you want, too
var hisFriendsSalary = new DataColumn("HisFriendsSalary", typeof(decimal) "Parent([R1To2]).[Salary]");
table2.Columns.Add(hisFriendsSalary);
不过,有几点需要注意:首先,当我第一次尝试这个时,我遇到了语法错误,而表达式中的关系名称周围没有方括号。不过,这可能与我用于关系的名称有关。
其次,我相信 Expressions 的结果是针对行存储的(它们不是在访问时“及时”计算的,它们是在值更改时计算的,并保留结果)。这意味着您使用这种方法存储了两次数据。有时这很好,有时则不然。
第三,你会注意到我没有使用约束。那是因为在我的典型用例中,我不希望每一行在另一个表中都有一个类似物(这就是为什么首先有两个表,经常!)。这可能(我没有检查过 dotnetframework.org)对性能有影响。