2016-08-02 1 views
0

외래 키 에 외래 키가있는 사용 권한을 저장하는 Sql Server에 다음 표가 있음 BlogId. 내가 뭘하고 싶은 BlogId 후 각 열을 취하고 KeyValuePair<TKey, TValue>로서 돌려 단정있는 쿼리를 작성합니다.하나의 데이터 행에있는 열의 KeyValuePair <TKey, TValue> 만들기

CREATE TABLE [dbo].[UserPermission] (
    [UserPermissionId]  INT IDENTITY (1, 1) NOT NULL, 
    [BlogId]    INT NOT NULL, 
    [UserId]    INT NOT NULL, 
    [CanCreateNewPosts] BIT NOT NULL, 
    [CanEditExistingPosts] BIT NOT NULL, 
    [CanDeleteExistingPosts] BIT NOT NULL, 
    [CanPublishDraftPosts] BIT NOT NULL, 
    CONSTRAINT [PK_UserPermission] PRIMARY KEY CLUSTERED ([UserPermissionId] ASC), 
    CONSTRAINT [FK_UserPermission_Blog] FOREIGN KEY ([BlogId]) REFERENCES [dbo].[Blog] ([BlogId]), 
    CONSTRAINT [FK_UserPermission_User] FOREIGN KEY ([UserId]) REFERENCES [dbo].[User] ([UserId]) 
); 
I 이렇게 단정 통해 조회하고자

: 위 예에서

using (var connection = new SqlConnection(this.connectionString)) 
{ 
    string sql = "SELECT * FROM [Permission] WHERE UserId = @UserId"; 
    await connection.OpenAsync(); 
    IEnumerable<KeyValuePair<string, bool>> results = await connection.QueryAsync(
     sql, 
     new { UserId = this.userId }); 
} 

var p1 = results.First(); 
var p2 = results.Skip(1).First(); 

, I는 CanCreateNewPosts되는 키와 값 열 가치와 KeyValuePair 발생하는 p1 싶습니다 true 또는 false입니다. 그것은 해당 값이야와 같은, 키가 CanEditExistingPostsp2으로 적용됩니다.

이에 대한 기본적인 요구 아이덴티티 클레임, 열당 하나의 제 목록 레코드로 변환 단순화하는 것이다.

splitOn:에서 보았을 때 UserId 열 뒤에 시도해보고 싶지만 그게 내가 원하는 것 같지 않습니다. 내가 분할 한 각 열에 대해 n 일반 인수가 필요합니다. 이상적으로는 미래의 내 보안/데이터/서비스 계층에서이 테이블에 열을 추가 할 것은 단지 청구로 돌려 처리 - 나를 그냥 주장을 확인하는 데 필요한 컨트롤러 작업에 집중할. 쿼리와 Dapper 리턴이 컬럼 이름/값을 KeyValuePairs 콜렉션으로 맵핑하면 나를 필요로하게됩니다.

답변

0

당신은 열 값에 열을 변환하기 위해 SQL UNPIVOT 작업을 사용할 수 있습니다. 다음은 특정 사건에 대한 예입니다 닫기

SELECT u.BlogId, u.permission 
FROM UserPermissions up 
UNPIVOT 
(
    permission for perms in (
     CanCreateNewPosts, 
     CanEditExistingPosts, 
     CanDeleteExistingPosts, 
     CanPublishDraftPosts 
    ) 
) u; 
+0

는; 필자가 본질적으로 원했던 것은 키 이름으로 반환되는 열 이름이었고 열 값은 해당 키에 대한 내 값으로 반환되었습니다. 그래서 나는 "CanCreateNewPost"라는 키와 "1"의 값을 가진 KeyValuePair를 가질 것입니다. BlogId, UserId 및 UserPermissionId는 포함되지 않습니다. –