Découper la chaîne avec Dapper.NET

c# dapper sql

Question

J'utilise Dapper.NET depuis un moment maintenant. Je me demandais s'il était possible de faire en sorte que Dapper coupe les chaînes car il les assigne aux propriétés de l'objet.

J'utilise actuellement LTRIM(RTRIM(fieldname)) dans le SQL et / ou value.Trim() dans le setter de propriétés.

Je travaille cependant avec une base de données héritée qui utilise des caractères au lieu de varchar, et je me demandais s'il y avait un moyen de réduire mon temps de devoir tout couper.

J'ai essayé moi-même en éditant le code source de dapper mais j'ai fini par casser d'autres mappages etc.

Je me demandais si quelqu'un avait des suggestions pour réduire ces frais généraux. (Il me manque peut-être quelque chose de très simple!)

Je travaille avec C # 3.5 par ailleurs.

Réponse acceptée

Je n'aimais pas l'idée de modifier directement Dapper. J'ai décidé de résoudre le problème en créant une méthode d'extension pour envelopper Dapper et juste réfléchir sur le résultat et couper toutes les propriétés de chaîne.

public static class DapperExtensions {
    public static IEnumerable<T> Query<T>(this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null) {
        var dapperResult = SqlMapper.Query<T>(cnn, sql, param, transaction, buffered, commandTimeout, commandType);
        var result = TrimStrings(dapperResult.ToList());
        return result;
    }

    static IEnumerable<T> TrimStrings<T>(IList<T> objects) {
        //todo: create an Attribute that can designate that a property shouldn't be trimmed if we need it
        var publicInstanceStringProperties = typeof (T).GetProperties(BindingFlags.Public | BindingFlags.Instance).Where(x => x.PropertyType == typeof (string) && x.CanRead &&  x.CanWrite);
        foreach (var prop in publicInstanceStringProperties) {
            foreach (var obj in objects) {
                var value = (string) prop.GetValue(obj);
                var trimmedValue = value.SafeTrim();
                prop.SetValue(obj, trimmedValue);
            }
        }
        return objects;
    }

    static string SafeTrim(this string source) {
        if (source == null) {
            return null;
        }
        return source.Trim();
    }
}

Ce qui est crucial pour ma solution (puisque je voulais utiliser le même nom que Dapper), c'est la résolution de la méthode d'extension, que vous pouvez lire ici .


Réponse populaire

Mat,

Cela peut être fait assez facilement. J'ai apporté cette modification pour nettoyer les espaces de caractères SQL. Je l'ai testé et mon code ne montre aucun signe de lenteur due au changement.

Assurez - vous que vous sauvegardez votre code source sortie il sera plus facile de revenir si vous avez besoin.

Suivant Créez la méthode suivante:

public static string ReadString(object value) /*** CUSTOM CODE ***/
{
    if (value == null || value is DBNull) return null; 
    return value.ToString().Trim();
}

Je marque toujours tous mes changements de code avec / * CUSTOM CODE * / pour que je puisse plus tard retrouver facilement mes modifications

Ensuite, trouvez la méthode suivante:

public static void SetTypeMap(Type type, ITypeMap map)

maintenant dans cette méthode localiser les lignes suivantes:

if (memberType == typeof (char) || memberType == typeof (char?))
{
    il.EmitCall(OpCodes.Call, typeof (SqlMapper).GetMethod(
        memberType == typeof (char) ? "ReadChar" : "ReadNullableChar",
        BindingFlags.Static | BindingFlags.Public), null);
        // stack is now [target][target][typed-value]
}
else

et modifier comme suit:

if (memberType == typeof (char) || memberType == typeof (char?))
{
    il.EmitCall(OpCodes.Call, typeof (SqlMapper).GetMethod(
        memberType == typeof (char) ? "ReadChar" : "ReadNullableChar",
        BindingFlags.Static | BindingFlags.Public), null);
        // stack is now [target][target][typed-value]
}
else if (memberType == typeof(string)) /*** CUSTOM CODE START ***/
{
    il.EmitCall(OpCodes.Call, typeof(SqlMapper).GetMethod("ReadString", BindingFlags.Static | BindingFlags.Public), null);
    // stack is now [target][target][typed-value]
}    /*** CUSTOM CODE END ***/
else

Compile et tu es prêt à partir




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