NHibernate Projections检索集合?

时间:2010-04-12 11:59:32

标签: nhibernate icriteria

我在投影中检索字符串集合时遇到了一些问题: 说我有以下课程

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
}

然后我有一个工作ID列表,我想检索WorkSet.Title,WorkSet.PartTitles和Id for。

我的想法是做这样的事情:

            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();

Id和Title加载得很好,但PartTitles返回null。 建议请!

1 个答案:

答案 0 :(得分:1)

使用条件可能无效。最有可能的原因是,这个集合无法通过标准生成的相同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)
select子句中允许

elements,但我不知道你会得到什么。您最有可能获得与结果中有PartTitles一样多的记录,因为只构建了一个SQL语句。