C# Sql CTE Query-выбор дополнительной информации


Я пытаюсь написать рекурсивный запрос CTE для построения древовидной связи плоской таблицы с 'marketGroupID' (идентификатор элемента) и' parentGroupID ' (идентификатор родителя элемента). Где каждая "рыночная группа" может иметь любое количество дочерних "рыночных групп" и так далее.

Вот мой рабочий запрос (протестирован в 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' класса автоматически созданного класса, построенный в реляционный конструктор объектов. Моя проблема заключается в том, что я теряю доступ к параметру Level для каждой "маркетгруппы", поскольку он не был частью самой таблицы и не имеет элемента в предоставленном классе.

Я хочу получить из запроса фактические объекты класса "invMarketGroup" и уровень, соответствующий каждому, чтобы я мог построить дерево из этого в памяти, представляющее эту структуру. Как бы я это сделал?

Спасибо

1 2

1 ответ:

Может быть проще создать представление 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");