1

我正在尝试基于 DataSet 中的 DataRelations 构建一个 DataTables 列表,其中返回的表仅包含在它们之间的关系中,提前知道链的每一端。这样我的数据集就有 7 个表。关系如下所示:

Table1 -> Table2 -> Table3 -> Table4 -> Table5
                           -> Table6 -> Table7

所以给定Table1和Table7,我想返回表1、2、3、6、7

到目前为止,我的代码遍历所有关系并返回所有表,因此在示例中它也返回 Table4 和 Table5。我已经将第一个,最后一个作为参数传递了,并且知道我还没有使用最后一个,我仍在努力思考如何去做,这是我需要帮助的地方。

type DataItem =
    | T of DataTable
    | R of DataRelation list

let GetRelatedTables (first, last) =
    let rec flat_rec dt acc =
        match dt with
        | T(dt)   -> 
            let rels = [ for r in dt.ParentRelations do yield r ]
            dt :: flat_rec(R(rels)) acc             
        | R(h::t) -> 
            flat_rec(R(t)) acc @ flat_rec(T(h.ParentTable)) acc
        | R([])   -> []
    flat_rec first []
4

1 回答 1

1

我认为这样的事情会做到这一点(虽然我还没有测试过)。它返回DataTable list option是因为理论上两个表之间的路径可能不存在。

let findPathBetweenTables (table1 : DataTable) (table2 : DataTable) =
    let visited = System.Collections.Generic.HashSet() //check for circular references
    let rec search path =
        let table = List.head path
        if not (visited.Add(table)) then None
        elif table = table2 then Some(List.rev path)
        else 
            table.ChildRelations
            |> Seq.cast<DataRelation>
            |> Seq.tryPick (fun rel -> search (rel.ChildTable::path))
    search [table1]
于 2014-07-18T18:39:51.283 回答