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));
...
...
我一直在我的项目中使用 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
类型的属性。
如您所见,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));
...
...