Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何修剪使用dapper返回的复杂对象中的所有字符串_C#_.net_Reflection_Dapper - Fatal编程技术网

C# 如何修剪使用dapper返回的复杂对象中的所有字符串

C# 如何修剪使用dapper返回的复杂对象中的所有字符串,c#,.net,reflection,dapper,C#,.net,Reflection,Dapper,我正在使用一个遗留数据库,在这个数据库中,数据被指定为列的最大长度。如果字符串数据较短,它将自动在末尾填充空白 我要做的是在每次查询时都要修剪所有这些结尾的空格 我认为更好的方法之一是使用反射为简洁的查询创建一个扩展方法 但我似乎无法让它发挥作用 母公司: public class Person: BaseEntity { public Identification Identification { get; set; } public Address Addr

我正在使用一个遗留数据库,在这个数据库中,数据被指定为列的最大长度。如果字符串数据较短,它将自动在末尾填充空白

我要做的是在每次查询时都要修剪所有这些结尾的空格

我认为更好的方法之一是使用反射为简洁的查询创建一个扩展方法

但我似乎无法让它发挥作用

母公司:

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; }
   }
现在,我按如下方式执行连接查询:


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

var result=_db.QueryTrim(sql,新的{userid=id})
.选择(p=>newperson()
{
标识=标识映射到标识实体(p),
Address=AddressMapper.MapToAddressEssentity(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();
    }
}
公共静态类DapperExtensions{
公共静态IEnumerable查询(此IDbConnection cnn,字符串sql,对象参数=null,IDbTransaction transaction=null,bool buffered=true,int?commandTimeout=null,CommandType?CommandType=null){
var dapperResult=SqlMapper.Query(cnn、sql、参数、事务、缓冲、命令超时、命令类型);
var result=TrimStrings(dapperResult.ToList());
返回结果;
}
静态IEnumerable字符串(IList对象){
//todo:创建一个属性,该属性可以指定在需要时不应修剪属性
var publicInstanceStringProperties=typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance)。其中(x=>x.PropertyType==typeof(string)&&x.CanRead&&x.CanWrite);
foreach(publicInstanceStringProperties中的var prop){
foreach(对象中的var obj){
var value=(字符串)prop.GetValue(obj);
var trimmedValue=value.SafeTrim();
道具设定值(obj、trimmedValue);
}
}
归还物品;
}
静态字符串SafeTrim(此字符串源){
if(source==null){
返回null;
}
返回source.Trim();
}
}

最后,我想修剪数据库中的所有字符串。目前我正在对dapperextension进行隧道访问,但如果有更好的方法。请让我知道。

如果您使用的是Dapper 1.50.2版,您可以用更简单的方法来完成

创建一个类型处理程序,如下所示:

公共类TrimmedStringHandler:SqlMapper.TypeHandler
{
公共重写字符串解析(对象值)
{
字符串结果=(值为字符串)?.Trim();
返回结果;
}
public override void SetValue(IDbDataParameter参数,字符串值)
{
参数值=值;
}
}
在程序初始化时,必须调用SqlMapper类的AddTypeHandler方法,如下所示:

SqlMapper.AddTypeHandler(新TrimmedStringHandler());

如果您这样做,来自数据库的每个字符串都将被修剪。

如果您使用的是Dapper 1.50.2版,您可以用一种更简单的方法来完成

创建一个类型处理程序,如下所示:

公共类TrimmedStringHandler:SqlMapper.TypeHandler
{
公共重写字符串解析(对象值)
{
字符串结果=(值为字符串)?.Trim();
返回结果;
}
public override void SetValue(IDbDataParameter参数,字符串值)
{
参数值=值;
}
}
在程序初始化时,必须调用SqlMapper类的AddTypeHandler方法,如下所示:

SqlMapper.AddTypeHandler(新TrimmedStringHandler());

如果您这样做,来自数据库的每个字符串都将被修剪。

在SQL中进行吗?@DavidG问题是我事先不知道哪些列需要修剪,哪些不需要修剪,您事先不知道吗?你肯定知道哪些列需要修剪吗?嗯,也许你是对的。我将尝试以这种方式实现它。同时,我将尝试使用一个简洁的扩展,这样我就不必总是在query second@DavidG中编写RTRIM。这也会减少从数据库传输的数据量。在SQL中进行吗?@DavidG问题是我事先不知道哪些列需要修剪,哪些不知道你事先不知道?你肯定知道哪些列需要修剪吗?嗯,也许你是对的。我将尝试以这种方式实现它。同时,我将尝试使用一个简洁的扩展,这样我就不必总是在query second@DavidG中编写RTRIM。这也将减少从数据库传输的数据量。这对我来说非常有效。它似乎也更容易实现。漂亮的解决方案!很好用。这对我很好用。它似乎也更容易实现。漂亮的解决方案!工作完美。
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();
    }
}