C# Sql CTE Query - 选择额外信息

标签 c# sql sql-server-2008 common-table-expression

我正在尝试编写 CTE 递归查询来构建平面表与“marketGroupID”(该元素的 ID)和“parentGroupID”(该元素的父 ID)的树关系。每个 'marketGroup' 可以有任意数量的子级 'marketGroups' 等等。

这是我的工作查询(在 SQL Server Management 中测试):

    With cte As
(SELECT [marketGroupID]
      ,[parentGroupID]
      ,[marketGroupName]
      ,[description]
      ,[iconID]
      ,[hasTypes]
      , 0 As Level
  FROM [Eve_Retribution_1.0.7].[dbo].[invMarketGroups]
  WHERE [parentGroupID] IS NULL
  UNION All
  Select mg.marketGroupID
    ,mg.parentGroupID
    ,mg.marketGroupName
    ,mg.description
    ,mg.iconID
    ,mg.hasTypes
    ,c.Level + 1 As Level
  FROM [Eve_Retribution_1.0.7].dbo.invMarketGroups mg
  Inner Join cte c On mg.parentGroupID = c.marketGroupID
  WHERE mg.marketGroupID <> mg.parentGroupID
)
  SELECT marketGroupID
    ,parentGroupID
    ,marketGroupName
    ,description
    ,iconID
    ,hasTypes
    , Level
  FROM cte

此查询以正确的顺序正确地列出了元素,Level 参数用于从元素构建树。

将其转换为 C# 是我遇到的问题。我已经集成了这个数据库,并且所有相应的表都已从我的数据库自动构建到我的代码中。我尝试使用 C# 调用此查询,如下所示:

    EveOnlineClassesDataContext context = new EveOnlineClassesDataContext();
    IEnumerable<invMarketGroup> results = context.ExecuteQuery<invMarketGroup>
            (@"**ABOVE QUERY**");

其中“invMarketGroup”类是由 O/R 设计器自动创建的类。我的问题是我无法访问每个“marketGroup”的 Level 参数,因为它不是表本身的一部分,并且在提供的类中没有元素。

我想从查询中检索实际的“invMarketGroup”类对象和对应于每个对象的级别,这样我就可以在内存中从中构建一棵表示此结构的树。我该怎么做呢?

谢谢

最佳答案

创建 View 可能更容易vwInvMarketGroup 在您的数据库中使用该查询:

CREATE VIEW vwInvMarketGroup AS
    With cte As
(SELECT [marketGroupID]
      ,[parentGroupID]
      ,[marketGroupName]
      ,[description]
      ,[iconID]
      ,[hasTypes]
      , 0 As Level
  FROM [Eve_Retribution_1.0.7].[dbo].[invMarketGroups]
  WHERE [parentGroupID] IS NULL
  UNION All
  Select mg.marketGroupID
    ,mg.parentGroupID
    ,mg.marketGroupName
    ,mg.description
    ,mg.iconID
    ,mg.hasTypes
    ,c.Level + 1 As Level
  FROM [Eve_Retribution_1.0.7].dbo.invMarketGroups mg
  Inner Join cte c On mg.parentGroupID = c.marketGroupID
  WHERE mg.marketGroupID <> mg.parentGroupID
)
  SELECT marketGroupID
    ,parentGroupID
    ,marketGroupName
    ,description
    ,iconID
    ,hasTypes
    , Level
  FROM cte
GO

然后你可以使用这个:

IEnumerable<invMarketGroup> results = context.ExecuteQuery<invMarketGroup>(@"SELECT * FROM vwInvMarketGroup");

关于C# Sql CTE Query - 选择额外信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14715410/

相关文章:

php - Mysql - php查询使用多个参数获取数组结果

mysql - 如何在 select 语句中使用 mysql 变量/如何在下一个 select 中使用 'as' 变量

mysql - 将两个表组合在一起以获得所有列,但我需要单独的数据行而不是一行

mysql - 关于在sql`中获取自动列

sql - 通过选择插入时,如何在插入表之前检查重复项

c# - 使用枚举数据 C# 创建对象列表

c# - 最大还是默认?

sql - 第二个最大值和最小值

c# - 尾递归的好处

c# - 将 DateTimePicker 控件设置为格式 YYYYMMDD?