Nhibernate 查询多对多而不使用Criteria API选择所有对象

Nhibernate 查询多对多而不使用Criteria API选择所有对象,nhibernate,hql,criteria-api,Nhibernate,Hql,Criteria Api,我有一个项目和网站之间的多对多关系。我正在尝试使用CriteriaAPI检索项目的站点列表。我已经完成了这项工作,但是查询还选择了关联项目的所有列,这是我不想要的。我使用HQL编写了我认为是等效的查询,它只选择站点列 var target1 = session.CreateQuery("select s from Site s join s.Projects pr where pr.ProjectId = ?") .SetInt32(0, projectId) .List<

我有一个项目和网站之间的多对多关系。我正在尝试使用CriteriaAPI检索项目的站点列表。我已经完成了这项工作,但是查询还选择了关联项目的所有列,这是我不想要的。我使用HQL编写了我认为是等效的查询,它只选择站点列

var target1 = session.CreateQuery("select s from Site s join s.Projects pr where pr.ProjectId = ?")
    .SetInt32(0, projectId)
    .List<Site>();

var target2 = session.CreateCriteria<Site>()
    .CreateAlias("Projects", "pr")
    .Add(Restrictions.Eq("pr.ProjectId", projectId))
    .List<Site>();
var target1=session.CreateQuery(“从站点中选择s加入s.Projects pr,其中pr.projectd=?”)
.SetInt32(0,projectId)
.List();
var target2=session.CreateCriteria()
.CreateAlias(“项目”、“公关”)
.Add(Restrictions.Eq(“pr.projectd”,projectd))
.List();

如何限制标准API版本(target2)仅选择站点列?我尝试使用投影,但没有方法投影类型。在这种情况下,我必须使用Criteria API。

我不确定这是否是最好的方法,但我使用SqlProjection实现了这一点:

Session.CreateCriteria<T>("foo")
            .CreateAlias("foo.Bar", "bar")
            .SetProjection(Projections.SqlProjection("{alias}.*", new string[] {}, new IType[] {}))
            .SetResultTransformer(new AliasToBeanResultTransformer(typeof(Foo)))
            .List<Foo>();

我不确定这是否是最好的方法,但我使用SqlProjection实现了这一点:

Session.CreateCriteria<T>("foo")
            .CreateAlias("foo.Bar", "bar")
            .SetProjection(Projections.SqlProjection("{alias}.*", new string[] {}, new IType[] {}))
            .SetResultTransformer(new AliasToBeanResultTransformer(typeof(Foo)))
            .List<Foo>();