用于确定两个表是否相关的函数

时间:2012-08-14 14:18:24

标签: c# .net sql logic

假设我在内存中有5个表模式作为DataTables,另一个DataTable是其他5个表之间的参照约束模式。

5个模式表是相关的,表A包含与B中的外键相关的主键列.B还包含与C中的外键列相关的主键列,以及C到D,但假设A ,B,C和D与E没有直接或间接相关。

两个数据表中将采用什么类型的函数并返回一个布尔值,指示这些表是相关还是“链接”。

我正在尝试完成的内容

假设我在拖放样式界面中向用户显示5个表中的所有列。我希望用户能够以图形方式构建查询,但我需要根据它们是否甚至可以在同一个select语句中返回来启用/禁用某些列。

3 个答案:

答案 0 :(得分:1)

你说你有第六个表包含其他表之间的约束。

假设您可以有效地使用此信息,并且只是尝试映射直接关系,您可能会执行以下操作:

  • 编译可能包含可从其他表引用的主键的所有表的列表
  • 遍历每个这样的表X.
    • 编译X
    • 相关的表格列表L.
    • 对于表X中的每个主键K,迭代L中的每个表,搜索对K的任何引用。
    • 一旦遇到任何K
    • 的引用,就会中断并跳到L中的下一个表
    • 以某种方式存储关系的信息(例如,每张桌子X的L表格列表)

我知道这是非常高级和抽象的,但我希望它有意义......

这可能需要一些时间才能运行,具体取决于表的数量和关系的复杂程度,但我看不到更好的替代方案。

您可以将有关“禁止”关系的信息存储在例如带有键的字典和每个表的列表中;这样的事情(对于单向关系,避免重复注册信息):

{TableA => {TableB, TableC}, 
 TableB => {TableC, TableD}, 
 TableC => {}, 
 etc..}

答案 1 :(得分:0)

如果表格存在于数据集中,则数据集也可能包含Datarelations,您可以迭代。

在加载数据时,数据库提供者没有填充数据集中的数据关系的可能性很高。

我担心你必须要求数据库获取关系信息。这是高度数据库和数据库提供者依赖。

您可以查看mygeneration mymetaNHibernate的来源,了解如何做到这一点。

答案 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;
}