2011-06-01 117 views
0

我正在处理一个项目,我使用C#来填充来自多个源的URL的单个MSSQL表。C#递归查询

该表包含链接重定向信息(下面的示例结构)。

RequestedURL, RedirectedURL 
www.123.com, www.123.com/123 
www.123.com/123, www.123.com/1234/link.asp 
www.123.com/1234/link.asp, www.123.com/12345/link.asp 

我很新的C#和需要编写某种递归查询都要经过各redirectedurl,如果是在requestedurl然后找到关联redirectedurl。某些网址可能会有多个重定向。

+0

什么码你尝试过这么远吗? – 2011-06-01 10:51:36

+0

没有一个MySQL查询应该这样做? – benwasd 2011-06-01 10:52:31

+0

@ben dotnet:DBMS是Microsoft SQL Server而不是MySQL。 – 2011-06-01 10:53:59

回答

0

您可以创建一个字典,其中RequestedUrl作为键和RedirectedUrl作为值。所以一旦你找到requestedUrl,你可以找到它的redirectedURL,如果这个redirectedURL有一个redirectedURL,你也可以找到它。

1

由于您在SQL Server数据库中有此数据,因此可能的方法是CTE的递归。起初,This explanation看起来有点混乱,但我认为如果你向下滚动到这个例子,它将清楚如何做到这一点。

这里没有重复完整的解释,这是这样的查询的例子:

USE AdventureWorks2008R2; 
GO 
WITH DirectReports (ManagerID, EmployeeID, Title, DeptID, Level) 
AS 
(
-- Anchor member definition 
    SELECT e.ManagerID, e.EmployeeID, e.Title, edh.DepartmentID, 
     0 AS Level 
    FROM dbo.MyEmployees AS e 
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh 
     ON e.EmployeeID = edh.BusinessEntityID AND edh.EndDate IS NULL 
    WHERE ManagerID IS NULL 
    UNION ALL 
-- Recursive member definition 
    SELECT e.ManagerID, e.EmployeeID, e.Title, edh.DepartmentID, 
     Level + 1 
    FROM dbo.MyEmployees AS e 
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh 
     ON e.EmployeeID = edh.BusinessEntityID AND edh.EndDate IS NULL 
    INNER JOIN DirectReports AS d 
     ON e.ManagerID = d.EmployeeID 
) 
-- Statement that executes the CTE 
SELECT ManagerID, EmployeeID, Title, DeptID, Level 
FROM DirectReports 
INNER JOIN HumanResources.Department AS dp 
    ON DirectReports.DeptID = dp.DepartmentID 
WHERE dp.GroupName = N'Sales and Marketing' OR Level = 0; 
GO 
0

如果我得到你的权利,你想有一个整洁的小C#功能找到最后重定向,对不对? 在这种情况下,这应该这样做:

string GetRedirectionFromDatabase(string requestUrl) 
{ 
    // Fetch redirect form DB, or if none exists return null 
} 

string GetFinalUrl(string requestUrl) 
{ 
    var redirection = GetRedirectionFromDatabase(requestUrl); 
    return redirection != null ? GetFinalUrl(redirection) : requestUrl; 
}