NHibernate:仅在实体列表(而不是对象)中加载特定属性

时间:2018-11-16 12:24:50

标签: c# nhibernate fluent-nhibernate

我一直在项目中使用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();

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

2 个答案:

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