C# 从一行删除多个对象

C# 从一行删除多个对象,c#,dapper,C#,Dapper,我有一行来自数据库 select "John" Name, "Male" Gender, 20 Age, "Rex" PetName, "Male" PetGender, 5 PetAge // ... many more ... 使用Dapper,我想将这一行分成两个对象: class Person { public string Name { get; set; } public stri

我有一行来自数据库

select "John" Name, 
       "Male" Gender,
       20 Age,
       "Rex" PetName,
       "Male" PetGender,
       5 PetAge
       // ... many more ...
使用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 ...
}
注意:这里没有层次关系,我只是尝试将一个数据库行映射到两个(或更多)对象中

我怎样才能用整洁的方式做到这一点

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

  • 我已经研究了
    QueryMultiple
    ,但它假设我正在运行多个查询。在我的现实场景中,这是一个非常昂贵的查询,我只想运行一次
  • 我还研究了返回
    Query
    ,但这需要一个
    Id
    列,这里没有层次关系或
    Id
    s。我只想获取一行并将其映射到多个列
您非常接近使用
Query
方法的解决方案。如果没有
Id
列,则可以提供
splitOn
参数:

connection.Query<Person, Pet, Tuple<Person, Pet>>(sql, 
    (person, pet) => Tuple.Create(person, pet), splitOn: "PetName");
connection.Query(sql、,
(person,pet)=>Tuple.Create(person,pet),splitOn:“PetName”);

我遗漏了什么吗?即使我提供了
splitOn
,我仍然会得到
ArgumentException:当使用多映射API时,如果您有Id以外的键,请确保设置splitOn参数。参数名称:splitOn
,这很奇怪。您可能需要向我们展示确切的sql查询和代码。不太可能,但可能你的splitOn字段也存在于第一种类型中,你想把它包括在第二种类型中吗?你是对的,当我在这个玩具场景中使用它时,它工作得很好。我必须深入研究,找出我的东西在真正的代码中哪里出了问题。逻辑非常简单。它按顺序查看列。在您的示例查询中,如果您说
splitOn=“PetName”
,它将使用前3列构建Person,其余的列构建Pet。如果Person有更多属性/字段不在前3列中,那么这些道具将保持其默认值(例如null)。在我看来,最好的文档是。