ExecuteList для объектов двух типов
От: _Budda_ Украина http://vfm.1gb.ru
Дата: 11.04.09 16:05
Оценка:
Есть некий набор классов

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 и в нём реализовать нужную логику... Но может уже есть ли что-то готовое?

Спасибо
Re: ExecuteList для объектов двух типов
От: andrex Украина  
Дата: 11.04.09 16:44
Оценка:
Здравствуйте, _Budda_, Вы писали:

_B_>Есть некий набор классов


ExecuteResultSet не подойдет?
... << RSDN@Home 1.2.0 alpha 4 rev. 1089>>
Я бы изменил мир — но Бог не даёт исходников...
Re[2]: ExecuteList для объектов двух типов
От: _Budda_ Украина http://vfm.1gb.ru
Дата: 11.04.09 18:48
Оценка:
_B_>>Есть некий набор классов
A>ExecuteResultSet не подойдет?
Спасибо!

Нашёл примерчик:
http://bltoolkit.net/Doc/Data/ExecuteResultSet.htm

Идею вроде понял, думаю, что должно подойти. Подскажите, плиз, где можно чуть детальнее почитать?

Спасибо ещё раз.
Re[3]: ExecuteList для объектов двух типов
От: ili Россия  
Дата: 13.04.09 03:05
Оценка:
Здравствуйте, _Budda_, Вы писали:

_B_>Идею вроде понял, думаю, что должно подойти. Подскажите, плиз, где можно чуть детальнее почитать?


в вики, которую сломали

еще здесь
Автор: ili
Дата: 28.03.09

юнит-тесты погляди, оно там ComplexMapping зовется
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.