Salut à tous,

Je cherche à faire une matrice des droits utilisateurs pour mon appli web (C#, .Net 4, Entity Framework Model First).

Je stocke les informations de droits dans deux tables :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE [dbo].[UserFieldVisibilitySet](
	[UFV_Id] [int] IDENTITY(1,1) NOT NULL,
	[UFV_FieldName] [nvarchar](max) NOT NULL,
	[UFV_UserLevelId] [int] NULL,
	[UFV_IsVisible] [bit] NULL,
 CONSTRAINT [PK_UserFieldVisibilitySet] PRIMARY KEY CLUSTERED 
(
	[UFV_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]
GO
ALTER TABLE [dbo].[UserFieldVisibilitySet]  WITH CHECK ADD  CONSTRAINT [FK_UserLevelUserFieldVisibility] FOREIGN KEY([UFV_UserLevelId])
REFERENCES [dbo].[UserLevelSet] ([UL_Id])
GO
ALTER TABLE [dbo].[UserFieldVisibilitySet] CHECK CONSTRAINT [FK_UserLevelUserFieldVisibility]
GO
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE [dbo].[UserLevelSet](
	[UL_Id] [int] IDENTITY(1,1) NOT NULL,
	[UL_Name] [varchar](250) NOT NULL,
	[UL_MinimalPoint] [int] NOT NULL,
 CONSTRAINT [PK_UserLevelSet] PRIMARY KEY CLUSTERED 
(
	[UL_Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED 
(
	[UL_Name] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
J'ai réalisé la requête suivante qui me retourne mes données comme je le souhaite :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
declare @LevelName varchar(max)
declare @DynamicStr nvarchar(max)
 
select distinct UFV_FieldName into #tempFields from UserFieldVisibilitySet
select distinct UL_Id, UL_Name into #tempLevel from UserLevelSet order by UL_Id
 
while ((select count(*) from #tempLevel) > 0)
begin
	set @LevelName = (select top 1 UL_Name from #tempLevel)
	set @DynamicStr = 'alter table #tempFields add [' + @LevelName + '] bit'
	exec sp_executesql @DynamicStr
	set @DynamicStr = 'update #tempFields set [' + @LevelName + '] = ' + '(select UFV_IsVisible from UserFieldVisibilitySet where UFV_FieldName = #tempFields.UFV_FieldName and UFV_UserLevelId = (select top 1 UL_Id from #tempLevel))'
	exec sp_executesql @DynamicStr
	delete from #tempLevel where UL_Name = @LevelName
end
 
select * from #tempFields
 
drop table #tempFields
drop table #tempLevel
Cette requête me retourne le résultat suivant (la première colonne étant composée de string et les autres de booléens) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
UFV_FieldName		Penseur débutant	Penseur occasionnel	Penseur récurrent	Penseur de grand chemin
U_BirthDate		0			0			1			1
U_CountPoints		0			0			1			1
U_Description		0			1			1			1
U_Id			0			0			0			0
U_Image			0			0			0			1
U_IsActive		0			0			0			0
U_LastConnection	0			0			0			1
U_Mail			0			0			0			1
U_Password		0			0			0			0
U_RegisterDate		0			0			0			1
U_UserLevelId		1			1			1			1
U_UserName		1			1			1			1
U_UserRightId		0			0			0			0
Jusque là, tout va bien, j'ai tout ce qu'il me faut.
Mon problème est pour ressortir tout ça au niveau de mon appli.

Je pensais utiliser un gridview avec ma proc stock comme source de données.
Le problème est qu'avec Entity (à moins que je n'ai loupé quelque chose), je dois indiquer le type de données qui m'est retourné.

Je me suis donc dit que je pourrais me contenter de transcrire cette requête en Linq mais là, je cale...

Comment alimenter mon gridview avec le résultat de cette requête ?
OU
Comment la transcrire en Linq ?

Merci de votre aide.

Max