NHibernate Linq и DistinctRootEntity - PullRequest
       16

NHibernate Linq и DistinctRootEntity

4 голосов
/ 28 апреля 2009

Когда я выполняю следующий запрос, я получаю исключение, сообщающее, что «feedItemQuery» содержит несколько элементов (поэтому SingleOrDefault не работает).

Это ожидаемое поведение при использовании API Критерии БЕЗ преобразователя DistinctRootEntity, но при использовании linq я ожидаю получить один корневой объект (FeedItem, со свойством Ads (of ICollection), содержащим все объявления).

Есть ли способ указать NHibernate.Linq использовать преобразователь DistinctRootEntity?

Мой запрос:

var feedItemQuery = from ad in session.Linq<FeedItem>().Expand("Ads")
                   where ad.Id == Id
                   select ad;

var feedItem = feedItemQuery.SingleOrDefault(); // This fails !?

Отображение:

<class name="FeedItem" table="FeedItems" proxy="IFeedItem">
    <id name="Id" type="Guid">
        <generator class="guid.comb"></generator>
    </id>
 ...
    <set name="Ads" table="Ads">
        <key column="FeedItemId" />
        <one-to-many class="Ad" />
    </set>
</class>

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

Ответы [ 2 ]

6 голосов
/ 01 сентября 2009

Вы можете использовать метод RegisterCustomAction для установки преобразователя результата:

var linqsession = session.Linq<FeedItem>();
linqsession.QueryOptions.RegisterCustomAction(c => c.SetResultTransformer(new DistinctRootEntityResultTransformer()));
var feedItemQuery = from ad in linqsession.Expand("Ads")
                    where ad.Id == Id
                    select ad
0 голосов
/ 15 мая 2009

var feedItemQuery = из объявления в сеансе .Linq (). Expand ("Ads")
где ad.Id == Id
выберите объявление **. FirstOrDefault (); **

...