当前位置: 首页 > 面试题库 >

LINQ中Oracle的CONNECT BY的SQL Server版本显示层次结构

别永年
2023-03-14
问题内容

遵循以下两个先前的答案并进行调整以获取所需的结果,我已经成功地在SQL Server
2008中模拟了Oracle CONNECT BY语句。但是如何在LINQ中做到这一点?

这是我正在使用虚拟数据库的示例:

CREATE TABLE Employee(
 EmployeeID INT IDENTITY(1,1) PRIMARY KEY,
 Department INT NOT NULL,
 EmployeeName VARCHAR(40) NOT NULL,
 PeckingOrder INT NOT NULL,
 HigherDepartment INT NULL)

INSERT INTO Employee (Department,EmployeeName,PeckingOrder,HigherDepartment)
VALUES (1,'Bart',1,NULL),(2,'Homer',1,1),(2,'Marge',2,NULL),
       (3,'Lisa',1,2),(3,'Maggie',2,2),(3,'Santas Helper',3,1)

EmployeeID Department EmployeeName PeckingOrder HigherDepartment
    1            1     Bart            1             NULL
    2            2     Homer           1              1 
    3            2     Marge           2             NULL
    4            3     Lisa            1              2
    5            3     Maggie          2              2
    6            3     Santas Helper   3              1

这是用于返回heirachy的SQL:

WITH n(level, PeckingOrder, Department, EmployeeName, HigherDepartment) AS 
    (SELECT 1, PeckingOrder, Department, EmployeeName, HigherDepartment
    FROM Test.dbo.Employee
    WHERE Department = 3
        UNION ALL
   SELECT n.level + 1, nplus1.PeckingOrder, nplus1.Department, nplus1.EmployeeName, nplus1.HigherDepartment 
   FROM Test.dbo.Employee as nplus1
   JOIN n ON n.HigherDepartment = nplus1.Department)
SELECT MAX(level) AS level, PeckingOrder, Department, EmployeeName, HigherDepartment   
FROM n
GROUP BY PeckingOrder, Department, EmployeeName, HigherDepartment
ORDER BY MAX(level) DESC, PeckingOrder ASC

level PeckingOrder Department EmployeeName HigherDepartment
  3         1           1           Bart             NULL
  2         1           2           Homer              1
  2         2           2           Marge             NULL
  1         1           3           Lisa               2
  1         2           3           Maggie             2
  1         3           3           Santas Helper      1

问题答案:

您可以使用ExecuteQuery

class YourRow
{
    public int level {get; set;}
    public int PeckingOrder {get; set;}
    ...
}

using (var db = new LinqDataContext())
{
    var list = db.ExecuteQuery<YourRow>(
@"
WITH n(level, PeckingOrder, Department, EmployeeName, HigherDepartment) AS 
    (SELECT 1, PeckingOrder, Department, EmployeeName, HigherDepartment
...
";
}

也许更好的做法是,创建一个包含查询的视图,然后使用LINQ从该视图读取。



 类似资料:
  • 免责声明: 这是一篇相当长的文章。我首先解释我正在处理的数据,以及我想用它做什么 然后,我详细介绍了我考虑过的三种可能的解决方案,因为我试着做作业(我发誓:])。我最后得到了一个“最佳猜测”,这是第一个解决方案的变体。 我的终极问题是:使用Cassandra解决我的问题的最明智的方法是什么?这是我的尝试之一,还是其他什么? 我正在寻求经验丰富的Cassandra用户的建议/反馈… 我的数据:< b

  • 我有这样的层次结构: 因此,用户可以添加他的工作经验。此外,他还可以为特定的项目添加角色。 我想为用户id 1获取项目,但项目之间只有关系 获取用户 获得工作经验 获取角色 获取项目 因此,如果我有更多不同工作经验的角色,我就必须提出20个请求才能得到我的项目。这不是很有效率吗?我必须加载一些不必要的数据。。。 是否可以只创建endpoint:并按用户ID过滤它? 应该如何在API上管理它?对我来

  • 问题内容: 我正在尝试呈现数据模型中 是否 有任何保存的数据。但我收到以下错误: 警告:尝试在其视图不在窗口层次结构中显示 相关代码: 我尝试过使用Google找到的其他解决方案,但均未成功。 问题答案: 此时,在代码中,视图控制器的视图仅已创建,尚未添加到任何视图层次结构中。如果您想尽快从该视图控制器中进行显示,则应确保最安全。

  • 问题内容: 我正在努力提高性能,以证明我已经写过并且没有运气的概念证明。我认为这种方法可能有缺陷,但是我正在努力寻找另一种解决方案。我介绍了我可以找到的所有Ask Tom文章和论坛帖子。 我们正在运行Oracle 10g R2。 我们将项目按层次结构排列。数量是在关系上定义的。层次结构中有两种类型的对象:逻辑分组的程序集和代表实际项目的项目。因此,如果我们要代表一个完整的工具集,我们将有一个代表整

  • 我打算将一个由多个单一java项目组成的旧Ant项目迁移到一个多模块maven项目。的所有库都存储在一个本地文件夹中。为了建立依赖关系管理,我想向父pom添加所有依赖关系。xml(依赖项管理部分),并尽我所能将正确的内容添加到子项(Java Maven项目),直到编译工作开始。 然后,我想通过使用“mvn依赖:树-X”来简化pom.xmls,看看我是否向单个Maven项目添加了一些不需要显式添加到

  • 我想使用OWL API在本体中创建类的类层次结构,类似于在Protege等工具中加载本体时可能看到的情况。 有关如何执行此操作的示例可在此处找到:http://sourceforge.net/p/owlapi/mailman/message/27600103/。 正如您所看到的,使用OWL API似乎很难精确地再现Protege层次结构,我想知道是否有一个例子可以再现Protege的行为,或者是否