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