Alias ​​de colonne Dapper.NET non mappé correctement

dapper sql

Question

J'ai un problème pour exécuter une requête avec Dapper.net. Dans l'exemple de code ci-dessous, vous pouvez voir quelques sous-sélections que j'ai associées au nom de colonne que je souhaite et qui correspondent également exactement au nom de propriété de mon objet.

Cependant, dans le résultat, aucune des propriétés correspondant aux sous-requêtes n'est renseignée correctement (toujours la valeur 0).

J'ai également profilé la requête et, si j'exécute la requête que j'ai vue dans le profileur sql, les résultats sont corrects (par exemple, NrEvents a une valeur où, comme dans mes objets résultants, il est toujours égal à 0).

En outre, le mappage de TvLogLockInfo avec EMUser est correct, cela se traduit bien, il n'y a donc pas le problème.

EDIT: En fait, si je supprime le mappage d'EMUser, les valeurs de la sous-requête DOIVENT être remplies. La question est donc de savoir comment ajouter le mappage entre TvLogLockInfo et EMUser et conserver les valeurs de la sous-requête ..?

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

Voici la fonction de recherche complète:

        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;

    }

Et c'est l'objet que je veux les résultats dans:

    [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; }

}

Des idées?

Merci Tom

Réponse acceptée

Le problème pourrait être la commande de votre requête et le paramètre splitOn. Vous utilisez 'LockedByUserId', ce qui signifie que toutes les colonnes AFTER (inclus) du paramètre splitOn appartiennent à l'objet EMUser . C'est pourquoi le mapping pour EMUser fonctionne mais pas pour les autres colonnes venant après la clé splitOn.

Essayez-le avec EvoMonUserId comme paramètre splitOn.



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi