0

我在检索投影中的字符串集合时遇到了一些麻烦:假设我有以下类

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 的工作 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();

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

4

1 回答 1

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)

elements在 select 子句中是允许的,但我不知道你会得到什么。您很可能会得到与结果中的 PartTitle 一样多的记录,因为只构建了一个 SQL 语句。

于 2010-04-12T12:06:16.743 回答