Próbuję uciec od Entity Framework, ponieważ muszę wspierać bazy danych HANA oprócz baz danych SQL Server w naszym rozwiązaniu.Czy to jest właściwy sposób używania Dapper, czy też robię to wszystko źle?
Zrobiłem kilka badań z dapper, więc stworzyłem szybkie środowisko testowe z pewnym fikcyjnym scenariuszem.
Mam następujące Poços które przypominają moje schematu bazy danych (mam więcej, ale ogranicza się do pokazując je dla uproszczenia):
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; }
}
używam następujących w repozytorium, aby powrócić do listy wszystkich przysposabiające:
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;
}
Jak widać, jestem pobierania danych dla każdego POCO indywidualnie na podstawie poprzedniej i robi przyłącza ręcznie w kodzie.
Czy jest to właściwy sposób robienia tego czy powinienem wykonywać duże zapytanie z wieloma złączeniami i mapować wynik w jakiś sposób za sprawą eleganckiego i LINQ?
To powoduje powstanie pożądanych obiektów, więc technicznie rzecz biorąc miałoby rację ... Jednak nadal jest to zła praktyka. Ten kod wykonuje kilka wywołań do twojej bazy danych (w zależności od tego, ile razy ma pętla), więc najlepiej byłoby użyć 1 zapytania, by pobrać wszystko na raz. – RandomStranger
Możesz przeczytać ten dokument => https://www.tritac.com/developers-blog/dapper-net-by-example/ "Lista obiektów z pojedynczym obiektem podrzędnym (multimap)" – pridemkA
Jeśli istnieje pojęcie takie jak a DataReader NextResult w Dapper, w którym wykonujesz wszystkie zapytania i zwracasz wiele zestawów rekordów, które dla nich wybrałem. –