Gil*_*men 2 .net c# reflection dapper
我正在使用旧数据库,在这个数据库中,数据被分配了列的最大长度。如果字符串数据较短,它会在末尾自动填充空格。
我想要做的是在我做的每个查询中修剪所有这些结尾的空格。
我认为更好的方法之一是使用反射为 dapper 查询制作扩展方法。
但我似乎无法让它工作。
父实体:
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; }
}
Run Code Online (Sandbox Code Playgroud)
子实体示例:
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; }
}
Run Code Online (Sandbox Code Playgroud)
现在我做我的加入查询是这样的:
var result = _db.QueryTrim<dynamic>(sql, new { userid = id })
.Select(p => new Person()
{
Identification = IdentificationMapper.MapToIdentificationEntity(p),
Address = AddressMapper.MapToAddressEntity(p)}).First();
Run Code Online (Sandbox Code Playgroud)
我正在尝试实现这样的东西,但我无法让它与查询一起使用
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();
}
}
Run Code Online (Sandbox Code Playgroud)
最后,我想修剪所有从数据库中出来的字符串。目前我正在对 dapperextension 进行隧道视觉,但如果有更好的方法。请告诉我。
如果您使用的是 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;
}
}
Run Code Online (Sandbox Code Playgroud)
在程序初始化时,您必须调用 SqlMapper 类的 AddTypeHandler 方法,如下所示:
SqlMapper.AddTypeHandler(new TrimmedStringHandler());
Run Code Online (Sandbox Code Playgroud)
如果这样做,来自数据库的每个字符串都将被修剪。
| 归档时间: |
|
| 查看次数: |
790 次 |
| 最近记录: |