다 대다 다 대다 쿼리

asp.net-mvc-4 dapper

문제

나는 그 / 그녀의 모든 역할을 가진 시스템에서 사용자를 얻는 쿼리를 작성하려고합니다. 사용자와 역할 간에는 다 대다 관계가 있습니다. RoleId 테이블은 UserIdRoleId 열이있는 SystemUserUserRole 입니다. 내 모델은 다음과 같습니다.

시스템 사용자 모델

[Key]
public int UserId { get; set; }

[Required]
[MaxLength(75)]
public string FirstName { get; set; }

[Required]
[MaxLength(75)]
public string LastName { get; set; }

[Required]
[MaxLength(15)]
public string Phone { get; set; }

[Required]
[MaxLength(250)]
public string Email { get; set; }

public virtual List<UserRole> UserRoles { get; set; }

UserRole 모델

[Key]
public int RoleId { get; set; }

[Required]
[MaxLength(250)]
public string RoleName { get; set; }

public virtual List<SystemUser> SystemUsers { get; set; }

나는 운이없는 아래 뭔가를하려고 노력하고있다. 내가 뭘 잘못하고 있는지에 대한 제안.

string query = "SELECT u.*, r.* FROM SystemUser u INNER JOIN SystemUserUserRole ur ON u.UserId = ur.UserId INNER JOIN UserRole r on ur.RoleId = r.RoleId WHERE Email = @email AND IsActive = true;";

SystemUser user = con.Query<SystemUser, UserRole, SystemUser>(query, (SystemUser, UserRole) => { SystemUser.UserRoles = UserRole; return SystemUser; }).First();

인기 답변

이것은 작동 할 것이다 :

SystemUser 클래스에서 목록을 초기화하는 생성자를 추가합니다.

public SystemUser()
{
    UserRoles = new List<UserRole>();
}

그런 다음 Dapper에게 결합 된 각 행에 대해 UserRole을 SystemUser.UserRoles에 추가해야한다고 말하십시오.

SystemUser user = con.Query<SystemUser, UserRole, SystemUser>(query,
    (SystemUser, UserRole) =>
    {
        SystemUser.UserRoles.Add(UserRole);
        return SystemUser;
    },
    splitOn: "RoleId").First();

Dapper에서는 ID 열의 이름이 Id 로 지정되기를 기대하기 때문에 splitOn 매개 변수를 추가하는 것이 마지막 부분입니다. 그렇지 않으면 열 이름을 명시 적으로 말해야합니다.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.