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