Запрос NHibernate - многие-ко-многим - энергичная загрузка (подписчики в стиле Twitter / подписчики) - PullRequest
2 голосов
/ 20 июля 2010

Я застрял в оптимизации одного из моих запросов ... вот мой сценарий ...

У меня есть домен, похожий на Twitter, где пользователь может следить за другими пользователями.Итак, вот пример моей модели User:

User
 -> Followers (many-to-many users)
 -> Following (many-to-many users)

Теперь мне нужно вернуть постраничный результат пользователей, следующих за пользователем 'XYZ', но также и данные о загрузке, необходимые для определения того, является ли зарегистрированный в данный момент пользовательследуя за возвращенными подписчиками.

Так что мне как-то нужно загрузить это: user->followers->following (возможно, с фильтром, чтобы просто получить данные following для текущего пользователя)

Это дажеможно сделать за 1 запрос, или мне нужно будет выполнить 2 отдельных запроса?1 запрос для возврата выгружаемых данных о подписчиках, затем другой запрос с указанием предложения IN с возвращенными идентификаторами для извлечения следующих данных для вошедшего в систему пользователя.

Paul

1 Ответ

1 голос
/ 20 мая 2011

Вам нужны два запроса для получения данных, но вы можете выполнить оба запроса за одну поездку, используя методы NHibernate Futures.

В вашем сценарии вы бы сделали что-то вроде

var user = Session.CreateCriteria<User>()
                    .SetFetchMode("Followers", FethMode.Eager)
                    .Add(Restrictions.Eq("Id", userId)
                    .FutureValue<User>();

Session.CreateCriteria<User>()
                    .SetFetchMode("Following", FethMode.Eager)
                    .Add(Restrictions.Eq("Id", userId)
                    .FutureValue<User>();
...