当它们具有相同名称的属性时,有没有办法将子对象或多个对象作为查询参数传递给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非常擅长,我的代码可能会表现得更糟。有办法做到这一点,还是反思我唯一的选择?