我一直在项目中使用NHibernate,直到那时为止,它的运行情况都非常好。 现在我面临一个问题,不知道如何解决。
问题是我想从表中仅获取x列而不是全部,然后将其绑定到原始实体,并为获取的列分配值,其他列应显示null。
例如我有表Employee作为 FieldName数据类型 ID int 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();
但是上面的代码以对象数组的形式返回受限的列数据。 我想让它绑定到实体而不是对象数组。 所以,请分享您对此的想法
答案 0 :(得分:2)
您需要设置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 :(得分:0)
@Rabban的答案很好地解释了这一点; +1。我只是换个说法。
如您所见,SetProjection
将返回对象数组。要将对象转换为实体,您需要调用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));
...
...