Je voudrais mettre en place une vue et une fonction basée sur la table associée basée sur le CTE. Mon raisonnement à ce sujet est que, alors que vous pourriez implémenter la logique du côté de l'application, cela impliquerait d'envoyer les données intermédiaires sur le fil pour le calcul dans l'application. En utilisant le concepteur DBML, la vue se traduit en une entité Table. Vous pouvez ensuite associer la fonction à l'entité Table et appeler la méthode créée sur DataContext pour dériver des objets du type défini par la vue. L'utilisation de la fonction table permet au moteur de recherche de prendre en compte vos paramètres lors de la construction du jeu de résultats plutôt que d'appliquer une condition sur l'ensemble de résultats défini par la vue après le fait.
CREATE TABLE [dbo].[hierarchical_table](
[id] [int] IDENTITY(1,1) NOT NULL,
[parent_id] [int] NULL,
[data] [varchar](255) NOT NULL,
CONSTRAINT [PK_hierarchical_table] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE VIEW [dbo].[vw_recursive_view]
AS
WITH hierarchy_cte(id, parent_id, data, lvl) AS
(SELECT id, parent_id, data, 0 AS lvl
FROM dbo.hierarchical_table
WHERE (parent_id IS NULL)
UNION ALL
SELECT t1.id, t1.parent_id, t1.data, h.lvl + 1 AS lvl
FROM dbo.hierarchical_table AS t1 INNER JOIN
hierarchy_cte AS h ON t1.parent_id = h.id)
SELECT id, parent_id, data, lvl
FROM hierarchy_cte AS result
CREATE FUNCTION [dbo].[fn_tree_for_parent]
(
@parent int
)
RETURNS
@result TABLE
(
id int not null,
parent_id int,
data varchar(255) not null,
lvl int not null
)
AS
BEGIN
WITH hierarchy_cte(id, parent_id, data, lvl) AS
(SELECT id, parent_id, data, 0 AS lvl
FROM dbo.hierarchical_table
WHERE (id = @parent OR (parent_id IS NULL AND @parent IS NULL))
UNION ALL
SELECT t1.id, t1.parent_id, t1.data, h.lvl + 1 AS lvl
FROM dbo.hierarchical_table AS t1 INNER JOIN
hierarchy_cte AS h ON t1.parent_id = h.id)
INSERT INTO @result
SELECT id, parent_id, data, lvl
FROM hierarchy_cte AS result
RETURN
END
ALTER TABLE [dbo].[hierarchical_table] WITH CHECK ADD CONSTRAINT [FK_hierarchical_table_hierarchical_table] FOREIGN KEY([parent_id])
REFERENCES [dbo].[hierarchical_table] ([id])
ALTER TABLE [dbo].[hierarchical_table] CHECK CONSTRAINT [FK_hierarchical_table_hierarchical_table]
Pour l'utiliser, vous feriez quelque chose comme - en supposant un certain schéma de nommage raisonnable:
using (DataContext dc = new HierarchicalDataContext())
{
HierarchicalTableEntity h = (from e in dc.HierarchicalTableEntities
select e).First();
var query = dc.FnTreeForParent(h.ID);
foreach (HierarchicalTableViewEntity entity in query) {
...process the tree node...
}
}
J'ai essayé une fonction comme celle-ci, et il semble être le chemin à parcourir. Et il peut être appelé depuis LINQ, attaché au datacontext. Aussi, pourquoi à la fois la vue et la fonction? - ils semblent être la duplication – Anthony
La fonction ne mappe pas le même schéma que la table. Il comprend le niveau. Si vous n'avez pas ajouté la colonne, vous pouvez la mapper directement sur la table. J'ai supposé que le niveau dans la hiérarchie était important. – tvanfosson