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

Ric*_*nia 7 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; }
}
Run Code Online (Sandbox Code Playgroud)

我想执行这个查询:

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

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

var personParams = new DynamicParameters(person);
personParams.AddDynamicParams(new { City_Id = person.City.Id, City_name = person.City.Name });
Run Code Online (Sandbox Code Playgroud)

但是在数据库上有数百个表,其中一些有一百多个列,我需要将它们拆分为多个类。因此,一个接一个地传递参数是徒劳的。

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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