Как обрезать все строки из сложного объекта, возвращенного с Dapper - PullRequest
0 голосов
/ 19 февраля 2019

Я работаю с устаревшей базой данных, в этой базе данных данным назначается максимальная длина столбца.если строковые данные короче, они автоматически заполняют пробелы в конце.

Я пытаюсь обрезать все эти конечные пробелы каждым запросом, который я делаю.

я понялодним из лучших способов было бы создание метода расширения для более щадящего запроса с использованием отражения.

Но я не могу заставить его работать.

родительский объект:

public class Person: BaseEntity
   {
       public Identification Identification { get; set; }
       public Address Address { get; set; }
       public Contact Contact { get; set; }
       public Family Family { get; set; }
       public ICollection<Payment> Payments { get; set; }
   }

пример дочерней сущности:

 public class Address: BaseEntity
    {
        public string Street { get; set;  }
        public int Number { get; set; }
        public string BoxNumber { get; set; }
        public int ZipCode { get; set; }
        public string City { get; set; }
        public string Country { get; set; }
    }

Теперь я делаю мой запрос на соединение следующим образом:


var result = _db.QueryTrim<dynamic>(sql, new { userid = id })
                .Select(p => new Person()
                {
Identification = IdentificationMapper.MapToIdentificationEntity(p),
                    Address = AddressMapper.MapToAddressEntity(p)}).First();

Я пытаюсь реализовать что-то подобное, но не могу получить егоработать с запросом

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

В конце я хочу обрезать все строки, которые выходят из базы данных.На данный момент я наблюдаю за расширением, но если есть какой-то лучший способ.Пожалуйста, дайте мне знать.

1 Ответ

0 голосов
/ 22 марта 2019

Если вы используете Dapper версии 1.50.2, вы можете сделать это более простым способом.

Создайте TypeHandler, как показано ниже:

public class TrimmedStringHandler : SqlMapper.TypeHandler<string>
{
    public override string Parse(object value)
    {
        string result = (value as string)?.Trim();
        return result;
    }

    public override void SetValue(IDbDataParameter parameter, string value)
    {
        parameter.Value = value;
    }
}

При инициализации программы вы должнывызовите метод AddTypeHandler класса SqlMapper, как показано ниже:

SqlMapper.AddTypeHandler(new TrimmedStringHandler());

Если вы сделаете это, каждая строка, поступающая из базы данных, будет обрезана.

...