NHibernate中的投影

NHibernate中的投影,nhibernate,projection,resulttransformer,Nhibernate,Projection,Resulttransformer,假设在一个实体中有id、用户名、年龄、地址等属性。现在我只需要id和用户名,我使用这个代码 投影支持从查询返回实体列表以外的内容 var proj = Projections.ProjectionList() .Add(Projections.Property("Id"), "Id") .Add(Projections.Property("Username"), "Username"); var list2 = DetachedCriteria.For<User>(

假设在一个实体中有id、用户名、年龄、地址等属性。现在我只需要id和用户名,我使用这个代码

投影支持从查询返回实体列表以外的内容

var proj = Projections.ProjectionList()
    .Add(Projections.Property("Id"), "Id")
    .Add(Projections.Property("Username"), "Username");

var list2 = DetachedCriteria.For<User>()
    .Add(Expression.Eq("Username", "lachlan"))
    .GetExecutableCriteria( sessionFactory.GetCurrentSession())
    .SetProjection( proj )
    .List();
var proj=Projections.ProjectionList()
.Add(Projections.Property(“Id”),“Id”)
.Add(Projections.Property(“用户名”),“用户名”);
var list2=DetachedCriteria.For()
.Add(Expression.Eq(“Username”、“lachlan”))
.GetExecutableCriteria(sessionFactory.GetCurrentSession())
.SetProjection(项目)
.List();

我将如何检索这些值。将在哪个对象中获取这些值。

除非使用结果转换器,否则投影将生成具有投影值的匿名对象列表。这对于数据绑定来说已经足够了

对于其他用途,您需要设置一个结果转换器,该转换器将创建已知类型的对象。
AliasToBeanTransformer
将为每行创建指定类型的对象,并将其属性设置为行值

如果您知道结果的类型,可以使用generic
List()
方法

var proj = Projections.ProjectionList()
    .Add(Projections.Property("Id"), "Id")
    .Add(Projections.Property("Username"), "Username");

var list2 = DetachedCriteria.For<User>()
    .Add(Expression.Eq("Username", "lachlan"))
    .GetExecutableCriteria( sessionFactory.GetCurrentSession())
    .SetProjection( proj )
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

虽然我没有使用3.0框架(var关键字),但我终于能够找到如何使用这个答案选择单个列!我花了一整天才找到它
list2 = Session.CreateSQLQuery("select Id, Username from user_table")
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();

list2 = Session.CreateQuery("select Id, Username from User")
    .SetResultTransformer(Transformers.AliasToBean(typeof(Result)))
    .List<Result>();
partial class Result
{
    public int Id { get; set; }
    public string Username { get; set; }
}