C# NHibernate:如何仅加载实体列表中的特定属性(而不是完整对象)?

C# NHibernate:如何仅加载实体列表中的特定属性(而不是完整对象)?,c#,nhibernate,C#,Nhibernate,我在我的项目中一直在使用NHibernate,到那时为止,它工作得非常好。 现在我面临一个问题,不知道如何解决它 问题是我想从表中只提取x列,而不是全部,然后将其绑定到原始实体,并为获取的列分配值,而其他列的值应显示为null e、 g.我有一名员工作为 字段名数据类型 ID int FName nvarchar(500) LName nvarchar(500) 恢复nvarchar(最大值) 从上面我只想获取Id、FName、LName并将其绑定到Employee实体,然后我们想通过使用NHi

我在我的项目中一直在使用NHibernate,到那时为止,它工作得非常好。 现在我面临一个问题,不知道如何解决它

问题是我想从表中只提取x列,而不是全部,然后将其绑定到原始实体,并为获取的列分配值,而其他列的值应显示为null

e、 g.我有一名员工作为 字段名数据类型 ID int FName nvarchar(500) LName nvarchar(500) 恢复nvarchar(最大值)

从上面我只想获取Id、FName、LName并将其绑定到Employee实体,然后我们想通过使用NHibernate进行单独的数据库调用来加载Resume

我试过了

var list = session
    .CreateCriteria(typeof (Employee))
    .SetProjection(Projections
                       .ProjectionList()
                       .Add(Projections.Property("Id"))
                       .Add(Projections.Property("FName"))
                       .Add(Projections.Property("LName")))
    .List();
但上面的代码以对象数组的形式返回受限列数据。 我想让它绑定到实体而不是对象数组。
因此,请分享您对此的想法

您需要设置
ResultTransformer
并使用类型调用
ToList()
,否则NHibernate不知道如何处理投影。您还需要在员工类型中指定目标属性名称。 您的查询可以如下所示:

var list = session
    .CreateCriteria(typeof (Employee))
    .SetProjection(Projections
                   .ProjectionList()
                   .Add(Projections.Property("Id"), "Id")
                   .Add(Projections.Property("FName"), "FirstName")
                   .Add(Projections.Property("LName"), "LastName"))
    .SetResultTransformer(Transformers.AliasToBean<Employee>())
    .List<Employee>();
var list=会话
.CreateCriteria(类型(员工))
.SetProjection(投影)
.ProjectionList()
.Add(Projections.Property(“Id”),“Id”)
.Add(Projections.Property(“FName”),“FirstName”)
.Add(Projections.Property(“LName”),“LastName”))
.SetResultTransformer(Transformers.AliasToBean())
.List();

请注意:“Id”、“FirstName”和“LastName”必须是
Employee
类型中的属性。

您需要设置
ResultTransformer
并使用该类型调用
ToList()
,否则NHibernate不知道如何处理投影。您还需要在员工类型中指定目标属性名称。 您的查询可以如下所示:

var list = session
    .CreateCriteria(typeof (Employee))
    .SetProjection(Projections
                   .ProjectionList()
                   .Add(Projections.Property("Id"), "Id")
                   .Add(Projections.Property("FName"), "FirstName")
                   .Add(Projections.Property("LName"), "LastName"))
    .SetResultTransformer(Transformers.AliasToBean<Employee>())
    .List<Employee>();
var list=会话
.CreateCriteria(类型(员工))
.SetProjection(投影)
.ProjectionList()
.Add(Projections.Property(“Id”),“Id”)
.Add(Projections.Property(“FName”),“FirstName”)
.Add(Projections.Property(“LName”),“LastName”))
.SetResultTransformer(Transformers.AliasToBean())
.List();
请注意:“Id”、“FirstName”和“LastName”必须是
员工
类型中的属性。

中的回答解释得很好+我向他道歉。我只是换一种说法

正如您所观察到的,
SetProjection
将返回对象数组。要将对象转换为实体,需要调用
SetResultTransformer(Transformers.AliasToBean()
。其他答案中已经给出了代码示例;我不再重复

您当前代码的问题是,您需要以字符串形式键入列名。我通常避免使用这种方法。我更喜欢使用强类型版本,如下面所示:

public IList<TEntity> GetList<TEntity>(ProjectionList columnList, Junction where, int top) where TEntity : BaseEntity
{
    IQueryOver<TEntity> query = null;
    if((columnList != null) && (where != null))
    {
        query = session.QueryOver<TEntity>()
                .Select(columnList)
                .TransformUsing(Transformers.AliasToBean<TEntity>())
                .Where(where);
    }
    else if((columnList != null) && (where == null))
    {
        query = session.QueryOver<TEntity>()
                .Select(columnList)
                .TransformUsing(Transformers.AliasToBean<TEntity>());
    }
    else if((columnList == null) && (where != null))
    {
        query = session.QueryOver<TEntity>()
                .Where(where);
    }
    else
    {
        query = session.QueryOver<TEntity>();
    }

    IList<TEntity> result = query.Take(top).List();
    return result;
}
ProjectionList columnList = Projections.ProjectionList();
columnList.Add(Projections.Property<Employee>(x => x.Id));
...
...
public IList GetList(ProjectionList columnList,Junction-where,int-top)其中tenty:BaseEntity
{
IQueryOver查询=null;
if((columnList!=null)&&(其中!=null))
{
query=session.QueryOver()
.选择(列列表)
.TransformUsing(Transformers.AliasToBean())
.何处;
}
else如果((columnList!=null)&&(其中==null))
{
query=session.QueryOver()
.选择(列列表)
.TransformUsing(Transformers.AliasToBean());
}
else if((columnList==null)和&(其中!=null))
{
query=session.QueryOver()
.何处;
}
其他的
{
query=session.QueryOver();
}
IList result=query.Take(top.List();
返回结果;
}
您可以将强类型列列表传递给此方法,如下所示:

public IList<TEntity> GetList<TEntity>(ProjectionList columnList, Junction where, int top) where TEntity : BaseEntity
{
    IQueryOver<TEntity> query = null;
    if((columnList != null) && (where != null))
    {
        query = session.QueryOver<TEntity>()
                .Select(columnList)
                .TransformUsing(Transformers.AliasToBean<TEntity>())
                .Where(where);
    }
    else if((columnList != null) && (where == null))
    {
        query = session.QueryOver<TEntity>()
                .Select(columnList)
                .TransformUsing(Transformers.AliasToBean<TEntity>());
    }
    else if((columnList == null) && (where != null))
    {
        query = session.QueryOver<TEntity>()
                .Where(where);
    }
    else
    {
        query = session.QueryOver<TEntity>();
    }

    IList<TEntity> result = query.Take(top).List();
    return result;
}
ProjectionList columnList = Projections.ProjectionList();
columnList.Add(Projections.Property<Employee>(x => x.Id));
...
...
ProjectionList columnList=Projections.ProjectionList();
Add(Projections.Property(x=>x.Id));
...
...
来自的回答很好地解释了这一点;+1对他来说。我只是换了一种说法

正如您所观察到的,
SetProjection
将返回对象数组。要将对象转换为实体,您需要调用
SetResultTransformer(Transformers.AliasToBean()
。代码示例已在其他答案中给出;我将不再重复

您当前代码的问题是,您需要以字符串形式键入列名。我通常避免使用这种方法。我更喜欢使用强类型版本,如下面所示:

public IList<TEntity> GetList<TEntity>(ProjectionList columnList, Junction where, int top) where TEntity : BaseEntity
{
    IQueryOver<TEntity> query = null;
    if((columnList != null) && (where != null))
    {
        query = session.QueryOver<TEntity>()
                .Select(columnList)
                .TransformUsing(Transformers.AliasToBean<TEntity>())
                .Where(where);
    }
    else if((columnList != null) && (where == null))
    {
        query = session.QueryOver<TEntity>()
                .Select(columnList)
                .TransformUsing(Transformers.AliasToBean<TEntity>());
    }
    else if((columnList == null) && (where != null))
    {
        query = session.QueryOver<TEntity>()
                .Where(where);
    }
    else
    {
        query = session.QueryOver<TEntity>();
    }

    IList<TEntity> result = query.Take(top).List();
    return result;
}
ProjectionList columnList = Projections.ProjectionList();
columnList.Add(Projections.Property<Employee>(x => x.Id));
...
...
public IList GetList(ProjectionList columnList,Junction-where,int-top)其中tenty:BaseEntity
{
IQueryOver查询=null;
if((columnList!=null)&&(其中!=null))
{
query=session.QueryOver()
.选择(列列表)
.TransformUsing(Transformers.AliasToBean())
.何处;
}
else如果((columnList!=null)&&(其中==null))
{
query=session.QueryOver()
.选择(列列表)
.TransformUsing(Transformers.AliasToBean());
}
else if((columnList==null)和&(其中!=null))
{
query=session.QueryOver()
.何处;
}
其他的
{
query=session.QueryOver();
}
IList result=query.Take(top.List();
返回结果;
}
您可以将强类型列列表传递给此方法,如下所示:

public IList<TEntity> GetList<TEntity>(ProjectionList columnList, Junction where, int top) where TEntity : BaseEntity
{
    IQueryOver<TEntity> query = null;
    if((columnList != null) && (where != null))
    {
        query = session.QueryOver<TEntity>()
                .Select(columnList)
                .TransformUsing(Transformers.AliasToBean<TEntity>())
                .Where(where);
    }
    else if((columnList != null) && (where == null))
    {
        query = session.QueryOver<TEntity>()
                .Select(columnList)
                .TransformUsing(Transformers.AliasToBean<TEntity>());
    }
    else if((columnList == null) && (where != null))
    {
        query = session.QueryOver<TEntity>()
                .Where(where);
    }
    else
    {
        query = session.QueryOver<TEntity>();
    }

    IList<TEntity> result = query.Take(top).List();
    return result;
}
ProjectionList columnList = Projections.ProjectionList();
columnList.Add(Projections.Property<Employee>(x => x.Id));
...
...
ProjectionList columnList=Projections.ProjectionList();
Add(Projections.Property(x=>x.Id));
...
...

您可以这样做,但从面向对象的角度来看,这不是一个好主意。生成的员工实例不是真正的员工,例如,更改不会持久化。在您的服务类(业务逻辑所在的位置)中,您不应该