我有一些代表数据库对象的C#类,其中一些包含一个或多个其他自定义对象或自定义对象的枚举类型。我正在使用Dapper进行查询,并使用定位器来映射到自定义对象。它适用于单个对象。我可以轻松地从数据库中获取具有特定ID的父对象,执行一些内部连接,并将它和它拥有的所有东西映射到C#中的自定义对象。当我想要对多个父ID进行选择时出现问题。从数据库中选择多个对象时,定位器只映射一个对象
某些情况下,比如说我有一个人,那个人有一份爱好列表,里面有一个ID和一个描述,他们可用的日期列表也有一个ID和描述,也可能是另一个自定义字段比如他们是否已经或者甚至愿意在孩子身边,也可以归结为一个简单的ID和描述。我们会调用最后一个字段的孩子状态。我会写一个select语句是这样的:
SELECT
,person.id as Id
,person.first_name as FirstName
,person.last_name as LastName
,hobby.Id as Hobbies_Id
,hobby.Description as Hobbies_Description
,avail.Id as Availabilities_Id
,avail.Description as Availabities_Description
,child.Id as ChildStatus_Id
,child.Description as ChildStatus_Description
FROM
users.users person
JOIN
users.userhobbies uhobby
ON
person.id = uhobby.UserId -- one-to-many with relational table
JOIN
users.avail hobby
ON
uhobby.HobbyId = hobby.Id
JOIN
users.useravailabilities uavail
ON
person.id = uavail.UserId -- one-to-many with relational table
JOIN
users.availabilities avail
ON
uavail.AvailId = avail.Id
JOIN
users.childstatuses child
ON
person.ChildStatusId = child.Id
然后我想这映射到用户是这样的:
class User
{
public Guid Id {get; set;}
public string FirstName {get; set;}
public string LastName {get; set;}
public IEnumerable<Hobby> Hobbies {get; set;}
public IEnumerable<Availability> Availabilities {get; set;}
public ChildStatus ChildStatus {get; set;}
}
由于我使用精确命名惯例和这里的一切,从查询Dapper和Automapping的工作很好,就像这样:
// Using the above sql in a variable
var data = Connection.Query<dynamic>(sql);
var dataReal = Slapper.AutoMapper.MapDynamic<User>(data);
return dataReal;
这很好,但它只返回一个用户。我有一个类似的方法,它需要一个ID,我的所有测试用户都可以通过传递ID完美地检索。我试过浏览互联网,查看文档,而我发现的所有内容都是这样的:https://github.com/SlapperAutoMapper/Slapper.AutoMapper/issues/57谁似乎只是通过裂缝。我也试图将动态数据映射到各种其他结构,但没有运气。提前致谢!
更新: 我想出了一个有点残酷的“大锤”型解决方案。我不知道在这个时候,如果有更方便的解决方案,我强迫自己使用Slapper。不过,我想确保任何处于类似情况的人都有机会使其工作。这里是新的C#部分:
var data = Connection.Query<dynamic>(sql);
IEnumerable<Guid> Ids = data.Select(row => (Guid)row.id).Distinct();
List<User> results = new List<User>();
foreach (Guid Id in Ids)
{
IEnumerable<dynamic> rows = data.Where(x => { return ((Guid) x.id).Equals(Id); });
User model = (Slapper.AutoMapper.MapDynamic<User>(rows, false) as IEnumerable<User>).FirstOrDefault();
if (model != null)
{
results.Add(model);
}
}
return results;
正如你所看到的,我产生的独特的“主要目标” ID的列表,并选择那些行到自己的名单,然后我传给搭接。我已经通过了“cache = false”参数,以避免在第一个对象之后将不相关的数据压缩到每个对象中。我可以通过实际保持UserHobby/UserAvailability/UserPhoto ID来解决这个问题,但我不喜欢让我的对象看起来的方式。希望这有助于某人。