使用nhibernate从DB表中选择部分数据

使用nhibernate从DB表中选择部分数据,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我有一个复杂的实体,非常非常重。 我只想从db中选择该实体的id和名称,以获得更好的性能。 如何使用nhibernate(或流利的nhibernate)。您有两种选择: 当使用ICriteria-use时(语法可能不正确,但您可以理解) 使用hql时 select c.Col1,c.Col2 from table c 它们都将返回一个数组列表列表-或者类似的东西-然后您必须遍历它并构建您的。。字典(或任何你有的) 有几种不同的可能性 创建新实体 一种可能的解决方案是创建一个新实体并将其映射到同

我有一个复杂的实体,非常非常重。 我只想从db中选择该实体的id和名称,以获得更好的性能。 如何使用nhibernate(或流利的nhibernate)。

您有两种选择:

当使用ICriteria-use时(语法可能不正确,但您可以理解)

使用hql时

select c.Col1,c.Col2 from table c

它们都将返回一个数组列表列表-或者类似的东西-然后您必须遍历它并构建您的。。字典(或任何你有的)

有几种不同的可能性

创建新实体

一种可能的解决方案是创建一个新实体并将其映射到同一个表,但只映射所需的列(id和名称)。这是非常灵活的,允许您将该实体用作任何其他实体。问题是您引入了一些重复

使用HQL

另一个解决方案是使用投影。使用HQL,可以使用select子句指定要检索的列。如果希望查询的结果是一个适当的实体实例,而不是一个对象数组,那么可以为类创建一个自定义构造函数,并在HQL查询中使用它

session.CreateQuery("select new Foo(f.Id, f.Name) from Foo f").List<Foo>();
标准示例代码取自以下问题,可能会引起兴趣:

session.CreateQuery("select new Foo(f.Id, f.Name) from Foo f").List<Foo>();
session.CreateCriteria(typeof(Foo))
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("Name"), "Name")
        .Add(Projections.Property("Id"), "Id"))
    .SetResultTransformer(Transformers.AliasToBean(typeof(Foo)))
    .List();