Dapper.NET 열 별칭이 올바르게 매핑되지 않았습니다.

dapper sql

문제

Dapper.net을 사용하여 쿼리를 실행하는 중 문제가 발생했습니다. 아래의 코드 샘플에서는 원하는 열 이름에 별칭을 지정하고 내 개체의 속성 이름과 정확히 일치하는 몇 개의 subselect를 볼 수 있습니다.

그러나 결과적으로 하위 쿼리에 해당하는 속성은 올바르게 채워지지 않습니다 (항상 값 0).

SQL 프로파일 러에서 본 쿼리를 실행하면 결과가 정확합니다 (예 : NrEvents에 내 결과 개체의 값이 항상 0 인 경우).

또한 TvLogLockInfo와 EMUser의 매핑이 정확하고 잘 번역되어 문제가 없습니다.

편집 : 사실 .. 만약 내가 EMUser의 매핑을 제거하면 하위 쿼리 값을 채우지 .. 그래서 질문, 어떻게 TvLogLockInfo와 EMUser 사이의 매핑을 추가하고 하위 쿼리 값을 채 웁니다 ..?

// this query will give me the correct values, but I lose the mapping of EMUser
res = ctx.Connection.Query<TvLogLockInfo>(query + where, qParams).ToList();

다음은 전체 검색 기능입니다.

        public List<TvLogLockInfo> SearchTvLogs(DateTime? dateFrom, DateTime? dateUntil, List<int> stationIds, bool isLockedOnly)
    {
        List<TvLogLockInfo> res;

        const string query =  " SELECT       /* tv log */                                                                                                                                                                                       " +
                        "               L.TvLogId, L.ReferenceDay, L.StationId, L.IsLocked, l.LockedDate, l.LockedByUserId,                                                                                                             " +
                        "               /* all events */                                                                                                                                                                                " +
                        "               (SELECT COUNT(TvLogEventId) FROM TvLogEvent E WITH (NOLOCK) WHERE E.TvLogId = L.TvLogId) AS NrEvents,                                                                                           " +
                        "               (SELECT COUNT(TvLogEventId) FROM TvLogEvent E WITH (NOLOCK) WHERE E.TvLogId = L.TvLogId AND E.IsTimeSet = 1) AS NrEventsTimeSet,                                                                " +
                        "               /* spots */                                                                                                                                                                                     " +
                        "               (SELECT COUNT(TvLogEventId) FROM TvLogEvent E WITH (NOLOCK) WHERE E.TvLogId = L.TvLogId  AND E.ThesaurusTypeEMListValueId = @spot AND E.MatchingInfoId IS NULL) AS NrSpotsNotMatched,           " +
                        "               (SELECT COUNT(TvLogEventId) FROM TvLogEvent E WITH (NOLOCK)                                                                                                                                     " +
                        "                                           INNER JOIN MatchingInfo I WITH (NOLOCK) ON E.MatchingInfoId = I.MatchingInfoId AND I.MatchStatusEMListValueId = @matchNew                                           " +
                        "                                           WHERE E.TvLogId = L.TvLogId AND E.ThesaurusTypeEMListValueId = @spot) AS NrSpotsMatchedNew,                                                                         " +
                        "               (SELECT COUNT(TvLogEventId) FROM TvLogEvent E WITH (NOLOCK)                                                                                                                                     " +
                        "                                           INNER JOIN MatchingInfo I WITH (NOLOCK) ON E.MatchingInfoId = I.MatchingInfoId AND I.MatchStatusEMListValueId = @matchValidated                                     " +
                        "                                           WHERE E.TvLogId = L.TvLogId AND E.ThesaurusTypeEMListValueId = @spot) AS NrSpotsMatchedValidated,                                                                   " +
                        "               /* autopromo */                                                                                                                                                                                 " +
                        "               (SELECT COUNT(TvLogEventId) FROM TvLogEvent E WITH (NOLOCK) WHERE E.TvLogId = L.TvLogId  AND E.ThesaurusTypeEMListValueId = @autopromo AND E.MatchingInfoId IS NULL) AS NrAutoPromoNotMatched,  " +
                        "               (SELECT COUNT(TvLogEventId) FROM TvLogEvent E WITH (NOLOCK)                                                                                                                                     " +
                        "                                           INNER JOIN MatchingInfo I WITH (NOLOCK) ON E.MatchingInfoId = I.MatchingInfoId AND I.MatchStatusEMListValueId = @matchNew                                           " +
                        "                                           WHERE E.TvLogId = L.TvLogId AND E.ThesaurusTypeEMListValueId = @autopromo) AS NrAutoPromoMatchedNew,                                                                " +
                        "               (SELECT COUNT(TvLogEventId) FROM TvLogEvent E WITH (NOLOCK)                                                                                                                                     " +
                        "                                           INNER JOIN MatchingInfo I WITH (NOLOCK) ON E.MatchingInfoId = I.MatchingInfoId AND I.MatchStatusEMListValueId = @matchValidated                                     " +
                        "                                           WHERE E.TvLogId = L.TvLogId AND E.ThesaurusTypeEMListValueId = @autopromo) AS NrAutoPromoMatchedValidated,                                                          " +
                        "               /* user */                                                                                                                                                                                      " +
                        "               U.*                                                                                                                                                                                             " +
                        " FROM          TvLog L WITH (NOLOCK)                                                                                                                                                                           " +
                        " LEFT JOIN EMUser U WITH (NOLOCK) ON L.LockedByUserId = U.EvoMonUserId                                                                                                                                         ";

        string where = string.Empty;
        DynamicParameters qParams = new DynamicParameters();
        qParams.AddDynamicParams(new { spot = (int)Enums.ThesaurusTypeList.Spot });
        qParams.AddDynamicParams(new { autopromo = (int)Enums.ThesaurusTypeList.AutoPromotion });
        qParams.AddDynamicParams(new { matchNew = (int)Enums.MatchingStatus.New });
        qParams.AddDynamicParams(new { matchValidated = (int)Enums.MatchingStatus.Validated });


        if (dateFrom.HasValue)
        {
            where += " L.ReferenceDay >= @dateFrom ";
            qParams.AddDynamicParams(new { dateFrom = dateFrom });
        }
        if (dateUntil.HasValue)
        {
            where += string.Format(" {0} L.ReferenceDay <= @dateUntil ", (string.IsNullOrWhiteSpace(where) ? string.Empty : "AND"));
            qParams.AddDynamicParams(new {dateUntil = dateUntil});
        }
        if (stationIds != null && stationIds.Count > 0)
        {
            where += string.Format(" {0} L.StationId IN @stationList ", (string.IsNullOrWhiteSpace(where) ? string.Empty : "AND"));
            qParams.AddDynamicParams(new {stationList = stationIds});
        }
        if (isLockedOnly)
        {
            where += string.Format(" {0} L.IsLocked = 1 ", (string.IsNullOrWhiteSpace(where) ? string.Empty : "AND"));                                
        }
        if (!string.IsNullOrWhiteSpace(where)) where = " WHERE " + where;

        using (var ctx = new DapperContext())
        {
            res = ctx.Connection.Query<TvLogLockInfo, EMUser, TvLogLockInfo>(query + where,
                                                                                (tvLog, emuser) =>
                                                                                {
                                                                                    tvLog.LockedByUser = emuser;
                                                                                    return tvLog;
                                                                                },qParams,
                                                                                splitOn: "LockedByUserId").ToList();
        }

        return res;

    }

그리고이 결과를 원하는 객체입니다.

    [Serializable]
public class TvLogLockInfo : EntityBase
{
    public int TvLogId { get; set; }
    public DateTime ReferenceDay { get; set; }
    public int StationId { get; set; }
    public bool IsLocked { get; set; }
    public DateTimeOffset? LockedDate { get; set; }
    public EMUser LockedByUser { get; set; }

    public int NrEvents { get; set; }
    public int NrEventsTimeSet { get; set; }
    public int NrSpotsNotMatched { get; set; }
    public int NrSpotsMatchedNew { get; set; }
    public int NrSpotsMatchedValidated { get; set; }
    public int NrAutoPromoNotMatched { get; set; }
    public int NrAutoPromoMatchedNew { get; set; }
    public int NrAutoPromoMatchedValidated { get; set; }

}

어떤 아이디어?

고마워, 톰

수락 된 답변

문제는 쿼리 및 splitOn 매개 변수의 순서 일 수 있습니다. 'LockedByUserId'를 사용하고 있습니다. 즉, splitOn 매개 변수가 EMUser 객체에 속한 이후의 모든 열을 의미합니다. EMUser에 대한 매핑이 작동하지만 splitOn 키 다음에 나오는 다른 열에 대해서는 매핑되지 않는 이유입니다.

EvoMonUserId 를 splitOn 매개 변수로 사용해보십시오.



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