Почему этот запрос Nhibernate возвращает пустой список? - PullRequest
0 голосов
/ 10 сентября 2009

Почему этот запрос не работает, он всегда возвращает пустой список (с отображением все в порядке, и я уверен, что в базе данных есть данные!) Есть идеи?

var ids = //IList<int> of ids 


var result = _session.CreateCriteria(typeof (User))
            .Add(Restrictions.InG("Id", ids))
            .CreateCriteria("Posts")
            .AddOrder(Order.Asc("CreatedOn"))
            .SetMaxResults(20)
           .List<Post>();

Ответы [ 2 ]

5 голосов
/ 10 сентября 2009

Попробуйте использовать что-то вроде этого:

List<User> users = _session.CreateQuery("FROM User ORDER BY CreatedOn").List<User>().Where(u => ids.Contains(u.Id));

var posts = new List<Post>();
foreach(User user in users) {
    posts.AddRange(user.Posts);
}

Полагаю, это будет зависеть от того, что у вашего пользователя уже есть коллекция сообщений, но в большинстве реализаций гибернации должно быть что-то подобное.

Вы также можете сжать его немного так:

List<Post> posts = _session.CreateQuery("FROM Post ORDER BY CreatedOn").List<Post>().Where(p => ids.Contains(p.User.Id));

ИЛИ третий вариант:

List<Post> posts = _session.CreateQuery("FROM Post ORDER BY CreatedOn WHERE User.Id IN (" + ids.ToArray().Join(",") + ")").List<Post>();
0 голосов
/ 10 сентября 2009

Ну, я просто использовал HQL вместо критериев API:

var result = _session.CreateQuery("from Post p order by p.CreatedOn where p.PostedBy.Id IN (" + sb + ")").List<Post>();

все работает просто отлично:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...