Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态将表连接到自身的替代方法_C#_Linq_Join_Dynamic - Fatal编程技术网

C# 动态将表连接到自身的替代方法

C# 动态将表连接到自身的替代方法,c#,linq,join,dynamic,C#,Linq,Join,Dynamic,对于一些额外的实践,我想创建一个应用程序,它将告诉用户将一个表连接到另一个表的路径。解决方案将基于输入SQL表演示测试的数据 我发现的最好的方法是动态地将表内部连接到它自身,直到我到达它可以连接到我下面演示的表为止。我不知道如何最好地自动化这一点,用户将输入任意两个表,看看是否有任何可能的连接路径,任何建议?使用sp_执行SQL的C/DynamicSQL CREATE TABLE #Test ( tbl1 varchar(20), tbl2 varchar(20), co

对于一些额外的实践,我想创建一个应用程序,它将告诉用户将一个表连接到另一个表的路径。解决方案将基于输入SQL表演示测试的数据

我发现的最好的方法是动态地将表内部连接到它自身,直到我到达它可以连接到我下面演示的表为止。我不知道如何最好地自动化这一点,用户将输入任意两个表,看看是否有任何可能的连接路径,任何建议?使用sp_执行SQL的C/DynamicSQL

CREATE TABLE #Test
(
    tbl1 varchar(20),
    tbl2 varchar(20),
    col  varchar(20)
)

insert into #Test Values ('A','B','c1')
insert into #Test Values ('A','C','c2')
insert into #Test Values ('A','B','c3')
insert into #Test Values ('B','D','c4')
insert into #Test Values ('D','F','c5')
insert into #Test Values ('F','H','c6')
insert into #Test Values ('C','Z','c7')
insert into #Test Values ('H','I','c8')

select * from #Test

select * 
  from #Test A
       inner join #Test B on a.tbl2 = b.tbl1
       inner join #Test C on b.tbl2 = c.tbl1
       inner join #Test D on c.tbl2 = D.tbl1
       inner join #Test e on d.tbl2 = e.tbl1
 where a.tbl1 = 'A' 

您使用的是什么数据库引擎?如果使用的数据库支持with语句,则可以使用递归with语句

在sqlite3中,这看起来像

WITH RECURSIVE #Test2 (tbl1, tbl2, col) AS (
    VALUES('A', 'B', 'c1')
    UNION ALL
    SELECT #Test.tbl1, #Test.tbl2, #Test.col
    FROM #Test,#Test2 WHERE #Test2.tbl2 = #Test.tbl1)
SELECT *
FROM #Test2;
这将为您提供从表A到表B到被引用的任何其他表的所有路径

我最终得到的结果是:

A|B|c1
B|D|c4
D|F|c5
F|H|c6
H|I|c8
如果希望从中获得不同的路径,则需要更改查询第二行中的值,以匹配测试表中的不同记录


通过使用multiple WITH语句,您可以做更多的事情,但我不能完全确定您是希望以不同的方式呈现信息,还是希望提供不同的输入。不管是哪种方式,我相信通过使用WITH语句,您可以得到您想要的结果,并且使用它们非常有趣:

我使用的是MS SQL Server 2008-您会说这将是SQL Server的公共表表达式吗?是的,我正在查看哪些CTE公共表表达式类似于WITH语句。语法看起来也差不多。