Есть некий набор классов
class A
{
public int Id{get;set;}
public B BId{get;set;}
}
class B
{
public int Id{get;set;}
public String Name{get;set;}
}
Задача извлечь из БД семейство объектов А, удовлетворяющих определённому критерию + все соответствующие объекты B.
Решение "в лоб":
using (DbManager db = new DbManager())
{
List<A> lstA = db.SetCommand("SELECT * FROM table_a WHERE XXX").ExecuteList<A>();
foreach (A a in lstA )
{
... db.SetCommand("SELECT * FROM table_b WHERE Id=@Id",db.Parameter("@Id",a.BId)).ExecuteObject<B>();
}
}
Неэффективно, т.к. имеем по 1 лишнему запросу на каждый член списка lstA...
Вижу вариант чуть более эффективный: пройтись по списку lstA, собрать ID всех объектов класса B, выбрать всех их отдельным запросом и сложить в сортированный хэш...
А вот в голову приходит вариант, подсказанный Фаулером:
для выбора объектов класса А использовать следующую кверю:
SELECT A.Id as AId, BId, B.Id as BId, B.Name FROM table_a A, table_b B WHERE XXX AND A.BId=B.Id
Но тогда приходим к тому, что (даже при наличии соответствующего маппинга полей) вариант ExecuteList<A> — вернёт избыточный список объектов А, ...
О.. идея, можно выполнить ExecuteList<B> и получить полный список объектов B... даже не составляя перечня идентификаторов нужных объектов...
Но всё же вот вопрос: Есть ли возможность используя BLToolkit, получить список объектов А, с выбранными объектами B, на основе RecordSet'а, сформированного последней кверей?
Насколько я понимаю, можно создать новый метод, например, ExecuteDependentList и в нём реализовать нужную логику... Но может уже есть ли что-то готовое?
Спасибо