NHibernate FetchMode Декартовой продукт - PullRequest
1 голос
/ 19 сентября 2011

В моем графе объектов VendorServiceRateChange имеет ленивое загруженное свойство IList<VendorService> VendorServiceList, а VendorService имеет ленивое загруженное свойство IList<ClientService>.

Когда я запускаю следующий код, я получаю декартово произведение между моим VendorServiceListи мой ClientServiceList.

queueList = session
    .CreateCriteria<VendorRateChange>()
    .Add(Restrictions.IsNull("ProcessedDate"))
    .Add(Restrictions.Le("EffectiveDate", DateTime.Now))
    .SetFetchMode("VendorServiceList", FetchMode.Join)
    .SetFetchMode("VendorServiceList.Vendor", FetchMode.Join)
    .SetFetchMode("VendorServiceList.CityService", FetchMode.Join)
    .SetFetchMode("VendorServiceList.ClientServices", FetchMode.Join)
    .SetResultTransformer(new DistinctRootEntityResultTransformer())
    .AddOrder(new Order("Audit.CreatedDate", true))
    .List<VendorRateChange>();

Есть ли способ структурировать этот запрос с использованием Criteria или DetachedCriteria, который не привел бы к декартовому продукту в качестве моего VendorServiceList?Я не хочу прибегать к тому, чтобы закомментировать выборку «VendorServiceList.ClientServices» и выполнить цикл с помощью вызова Initialize после возвращения исходного запроса.

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 19 сентября 2011

Вы уверены, что это декартово произведение, или вы только что получили «дублированные» строки в перенастроенном списке?Если это так, то перед .List() попытайтесь вызвать .SetResultTransformer(Transformers.DistinctRootEntity), потому что, стремясь извлечь связанную коллекцию, вы получите список, содержащий дубликаты того же объекта .

1 голос
/ 20 сентября 2011

У вас может быть один FetchMode.Join, прежде чем вы начнете создавать декартовы произведения.Что если вы переключите других на FetchMode.Select или что-то еще?

...