Dapper - 将子对象作为查询参数传递

时间:2017-08-22 11:46:45

标签: c# dapper

当它们具有相同名称的属性时,有没有办法将子对象或多个对象作为查询参数传递给Dapper?

例如,如果我有这些类:

class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public City City { get; set; }
}

class City
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我想执行此查询:

connect.QueryFirst<Result>("select :Id Id, :Name Name, :City_Id City_Id, :City_Name City_Name from dual", personParams);

我设法做到没有反射的唯一方法是传递第一个对象,然后逐个添加其他属性:

var personParams = new DynamicParameters(person);
personParams.AddDynamicParams(new { City_Id = person.City.Id, City_name = person.City.Name });

但是在数据库上有数百个表,其中一些表有一百多列,我需要将它们分成多个类。因此,逐个传递参数将是不可取的。

我尝试将参数添加到临时包中,然后为每个参数添加一个前缀,如下所示:

static DynamicParameters GetParameters(object mainEntity, object otherEntities)
{
    var allParams = new DynamicParameters(mainEntity);
    foreach (PropertyDescriptor descriptor in TypeDescriptor.GetProperties(otherEntities))
    {
        object obj = descriptor.GetValue(otherEntities);
        var parameters = new DynamicParameters(obj);
        foreach (var paramName in parameters.ParameterNames)
        {
            var value = parameters.Get<object>(paramName);
            allParams.Add($"{descriptor.Name}{paramName}", value);
        }
    }
    return allParams;
}

但它不起作用,因为Dapper只在命令执行时填充参数,而不是在创建DynamicParamters时填充。

我想避免反思,因为Dapper非常擅长,我的代码可能会表现得更糟。有办法做到这一点,还是反思我唯一的选择?

0 个答案:

没有答案