KeyValuePair 만들기 단일 데이터 행의 열에서

asp.net-identity dapper sql-server

문제

외부 키 UserId 가 Foreign Keyed BlogId 대한 사용 권한을 저장하는 다음 표가 Sql Server에 있습니다. 내가 BlogId 하고 BlogIdBlogId 다음에 각 열을 가져 와서 KeyValuePair<TKey, TValue> 로 반환하는 Dapper로 쿼리를 작성하는 것입니다.

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])
);

Dapper를 통해 다음과 같이 쿼리하고 싶습니다 :

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();

위의 예에서, 내가 좋아하는 것 p1 A의 결과에 KeyValuePair 키 존재의와 CanCreateNewPosts true 또는 false하고 값이 열 가치. Key가 CanEditExistingPosts 가 될 p2 와 동일한 값이 적용됩니다.

이에 대한 근본적인 필요는 레코드를 ID 당 클레임 목록으로 변환하는 것을 단순화하는 것입니다.

나는 splitOn: 보았고, UserId 컬럼 이후에 분할하려고했지만, 그것이 내가 원하는 것처럼 보이지 않았다. 내가 분할 한 각 열에 대해 n 일반 인수가 필요합니다. 이상적으로이 테이블에 열을 추가하고 보안 / 데이터 / 서비스 계층에서 클레임으로 처리하는 것이 좋습니다. 클레임을 확인해야하는 컨트롤러 작업에만 초점을 맞 춥니 다. 쿼리 및 Dapper 반환 맵을 사용하면 열 이름 / 값을 KeyValuePairs 컬렉션으로 가져와 나를 필요로하게됩니다.

인기 답변

SQL UNPIVOT 조작을 사용하여 C 럼을 C 럼 값으로 변환 할 수 있습니다. 다음은 사례에 대한 예입니다.

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


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow