我想摆脱实体框架,因为我不得不在我们的解决方案中支持SQL服务器数据库以外的HANA数据库。这是使用Dapper的正确方式还是我做错了?
我正在做一些研究与短纤维,所以我创建了一个虚拟场景的快速测试环境。
我有以下波苏斯类似于我的数据库架构(我有更多的,但我仅限于显示这些为简单起见):
public class Adopter
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
public string Address2 { get; set; }
public string City { get; set; }
public State State { get; set; }
public int StateId { get; set; }
public string Zip { get; set; }
public string Email { get; set; }
public string Phone { get; set; }
public string Fax { get; set; }
public IEnumerable<Pet> Pets { get; set; }
}
public class State
{
public int Id { get; set; }
public string Name { get; set; }
public string Abreviation { get; set; }
}
public class Pet
{
public int Id { get; set; }
public string IdTag { get; set; }
public string Name { get; set; }
public DateTime AdmitionDate { get; set; }
public Status Status { get; set; }
public int StatusId { get; set; }
public string Notes { get; set; }
public DateTime AdoptionDate { get; set; }
public bool IsAdopted { get; set; }
public int? AdopterId { get; set; }
public int Age { get; set; }
public decimal Weight { get; set; }
public string Color { get; set; }
public Breed Breed { get; set; }
public int BreedId { get; set; }
public Gender Gender { get; set; }
public int GenderId { get; set; }
public IEnumerable<PetImage> PetImages { get; set; }
}
public class Status
{
public int Id { get; set; }
public string Name { get; set; }
public string Description { get; set; }
}
public class Gender
{
public int Id { get; set; }
public string Name { get; set; }
}
我正在使用的存储库下面来回报所有列表使用者:
using (SqlConnection connection = new SqlConnection(_connectionString))
{
var adopters = connection.Query<Adopter>("SELECT a.* FROM Adopters a");
foreach (var adopter in adopters)
{
adopter.State = connection.QueryFirst<State>("Select s.* FROM States s WHERE s.Id = @Id", new { Id = adopter.StateId });
adopter.Pets = connection.Query<Pet>("Select p.* FROM Pets p WHERE p.AdopterId = @Id", new { Id = adopter.Id });
foreach (var pet in adopter.Pets)
{
pet.Status = connection.QueryFirst<Status>("Select s.* FROM Status s WHERE s.Id = @Id", new { Id = pet.StatusId });
pet.Gender = connection.QueryFirst<Gender>("Select g.* FROM Genders g WHERE g.Id = @Id", new { Id = pet.GenderId });
}
}
return adopters;
}
正如你所看到的,我单独检索基于前一个每个POCO的数据,做在代码中手动加入。
这是做这件事的正确方法吗?或者我应该做一个有多个连接的大查询并以某种方式通过简洁和LINQ来映射结果?
这会导致所需的对象,所以它在技术上是正确的......但这仍然是一个糟糕的做法。此代码对数据库执行多次调用(取决于循环的次数),因此最好使用1个查询一次检索所有内容。 – RandomStranger
您可以阅读本文=> https://www.tritac.com/developers-blog/dapper-net-by-example/“具有单个子对象(multimap)的对象列表” – pridemkA
如果存在像在Dapper中执行所有查询并返回多个记录集的DataReader NextResult,我会为此付出代价。 –