NHibernate Прогнозы для получения коллекции? - PullRequest
0 голосов
/ 12 апреля 2010

У меня возникли проблемы с получением набора строк в проекции: скажи, что у меня есть следующие классы

public class WorkSet {
    public Guid Id { get; set; }
    public string Title { get; set; }
    public ISet<string> PartTitles { get; protected set; }
}
public class Work {
    public Guid Id { get; set; }
    public WorkSet WorkSet { get; set; }
    //a bunch of other properties
}

У меня есть список рабочих идентификаторов, для которых я хочу получить WorkSet.Title, WorkSet.PartTitles и Id.

Моя мысль была сделать что-то вроде этого:

            var works = Session.CreateCriteria<Work>()
            .Add(Restrictions.In("Id", hitIds))
            .CreateAlias("WorkSet", "WorkSet")
            .SetProjection(
            Projections.ProjectionList()
                .Add(Projections.Id())
                .Add(Projections.Property("WorkSet.Title"))
                .Add(Projections.Property("WorkSet.PartTitles")))
            .List();

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

1 Ответ

1 голос
/ 12 апреля 2010

Это может не работать с использованием критериев. Скорее всего, это потому, что набор не может быть получен тем же SQL-запросом, который сгенерирован критериями.

Я бы действительно подумал, чтобы получить весь объект. Это намного проще, и если это не очень особый случай, это не стоит хлопот. (Кстати, это может быть быстрее для извлечения целых объектов, возможно, они уже находятся в кэше.) Обычно учитывается количество запросов (и их сложность, конечно), а не количество извлеченных столбцов.

Вероятно, он работает с HQL, там есть функция elements. В любом случае рассмотрите возможность использования HQL для статических запросов, он более мощный.

select 
  ws.Title, 
  elements(ws.PartTitles), 
  w.id
from 
  Work w 
  inner join w.WorkSet ws
where w.id in (:ids)

elements разрешено в предложении select, но я не знаю, что вы получите. Скорее всего, в результате вы получите столько записей, сколько будет PartTitles, потому что построен только один оператор SQL.

...