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

NHibernate: How to load only specific properties in a list of entities (instead of full object)?

我一直在我的项目中使用 NHibernate,它一直运行良好。 现在遇到一个问题不知道怎么解决

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

例如我有 table 名员工 字段名数据类型 标识整数 FName nvarchar(500) LName nvarchar(500) 恢复 nvarchar(max)

从上面我只想获取 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();

但上面的代码 returns 限制了列数据,但以对象数组的形式。 我想让它绑定到实体而不是对象数组。 所以,请分享您对此的看法

您需要设置 ResultTransformer 并使用类型调用 ToList(),否则 NHibernate 不知道如何处理投影。您还需要在 Employee 类型中指定目标 属性 名称。 您的查询可能看起来像这样:

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

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

的回答解释得很好; +1给他。我只是换一种说法。

如您所见,SetProjection 将 return 对象数组。要将对象转换为实体,您需要调用 SetResultTransformer(Transformers.AliasToBean<Entity>()。代码示例已在其他答案中给出;我就不重复了。

您当前代码的问题在于,您需要将列名称键入 string。我通常避免这种方法。我更喜欢使用 IQueryOver 的强类型版本,如下所示:

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