假设我在内存中有5个表模式作为DataTables,另一个DataTable是其他5个表之间的参照约束模式。
5个模式表是相关的,表A包含与B中的外键相关的主键列.B还包含与C中的外键列相关的主键列,以及C到D,但假设A ,B,C和D与E没有直接或间接相关。
两个数据表中将采用什么类型的函数并返回一个布尔值,指示这些表是相关还是“链接”。
我正在尝试完成的内容
假设我在拖放样式界面中向用户显示5个表中的所有列。我希望用户能够以图形方式构建查询,但我需要根据它们是否甚至可以在同一个select语句中返回来启用/禁用某些列。
答案 0 :(得分:1)
你说你有第六个表包含其他表之间的约束。
假设您可以有效地使用此信息,并且只是尝试映射直接关系,您可能会执行以下操作:
我知道这是非常高级和抽象的,但我希望它有意义......
这可能需要一些时间才能运行,具体取决于表的数量和关系的复杂程度,但我看不到更好的替代方案。
您可以将有关“禁止”关系的信息存储在例如带有键的字典和每个表的列表中;这样的事情(对于单向关系,避免重复注册信息):
{TableA => {TableB, TableC},
TableB => {TableC, TableD},
TableC => {},
etc..}
答案 1 :(得分:0)
如果表格存在于数据集中,则数据集也可能包含Datarelations,您可以迭代。
在加载数据时,数据库提供者没有填充数据集中的数据关系的可能性很高。
我担心你必须要求数据库获取关系信息。这是高度数据库和数据库提供者依赖。
您可以查看mygeneration mymeta或NHibernate的来源,了解如何做到这一点。
答案 2 :(得分:-1)
// we have not defined which argument is the "parent" and which is the "child"
public bool IsTableRelated(DataTable thisOne, DataTable thatOne) {
bool thisToThat = DiveDive(thisOne.Constraints, thatOne);
bool thatToThis = DiveDive(thatOne.Constraints, thisOne);
return thisToThat || thatToThis;
}
public bool DiveDive(ConstraintsCollection constraints, DataTable target) {
bool theyRelate = false;
foreach (Constraint aConstraint in constraints){
if (aConstraint is ForeignKeyConstraint) {
if(aConstraint.Table.TableName == target.TableName) {
theyRelate = true;
break; // quit while we're ahead.
}else{
theyRelate = DiveDive(aConstraint.Table.Constraints, target);
}
}
}
return theyRelate;
}