从一行中精心设计多个对象

Jay*_*van 14 c# dapper

我有一行来自数据库

select "John" Name, 
       "Male" Gender,
       20 Age,
       "Rex" PetName,
       "Male" PetGender,
       5 PetAge
       // ... many more ...
Run Code Online (Sandbox Code Playgroud)

使用Dapper,我想把这一行拉成两个对象:

class Person
{
    public string Name { get; set; }
    public string Gender { get; set; }
    public int Age { get; set; }
    // ... many more ...
}    
class Pet
{
    public string PetName { get; set; }
    public string PetGender { get; set; }
    public int PetAge { get; set; }
    // ... many more ...
}
Run Code Online (Sandbox Code Playgroud)

注意:这里没有层次关系,我只是想将一个数据库行映射到两个(或更多)对象.

我怎么能用小巧玲珑呢?

  • 我知道我可以通过返回动态并手动映射每个对象来实现这一点,这很痛苦,因为在我的场景中我们有大量的列.我宁愿不这样做.(不,它不能重新设计,需要更少的列.)

我尝试过的:

  • 我调查过QueryMultiple<Person,Pet>,但它假设我正在运行多个查询.在我的现实场景中,这是一个非常昂贵的查询,我想只运行一次.
  • 我也考虑过返回Query<Person,Pet,Tuple<Person,Pet>>,但这需要一个Id专栏,这里没有任何关系或者Ids.我只想采取一行并将其映射到多个列.

Ere*_*mez 18

您使用该Query方法非常接近解决方案.如果您没有Id列,则可以提供splitOn参数:

connection.Query<Person, Pet, Tuple<Person, Pet>>(sql, 
    (person, pet) => Tuple.Create(person, pet), splitOn: "PetName");
Run Code Online (Sandbox Code Playgroud)

  • 逻辑非常简单.它按顺序查看列.在你的示例查询中,如果你说`splitOn ="PetName"`,它将使用前3列来构建Person,其余的用于构建Pet.如果Person有更多属性/字段不在前3列中,那么这些道具将保持其默认值(例如null). (2认同)