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

时间:2009-07-25 15:34:18

标签: nhibernate fluent-nhibernate

我有一个复杂的实体,非常沉重。 我想从数据库中仅选择此实体的ID和名称以获得更好的性能。 我如何用nhibernate(或流利的nhibernate)来做到这一点。

2 个答案:

答案 0 :(得分:5)

有几种不同的可能性。

创建新实体

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

使用HQL

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

session.CreateQuery("select new Foo(f.Id, f.Name) from Foo f").List<Foo>();

使用Criteria API

如果要使用Criteria API而不是HQL,可以使用SetProjection方法。如果您想从查询中获取正确的实体而不是对象数组,则可以使用AliasToBean结果转换器。

session.CreateCriteria(typeof(Foo))
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("Name"), "Name")
        .Add(Projections.Property("Id"), "Id"))
    .SetResultTransformer(Transformers.AliasToBean(typeof(Foo)))
    .List();

标准示例代码借鉴了以下问题,这可能是有意义的: NHibernate - Only retrieve specific columns when using Critera queries?

答案 1 :(得分:1)

您有两个选择:

使用ICriteria时 - 使用(语法可能不正确但你得到了图片)

SetProjections(Projections.ProjectionList.Add(Projections.Property("prop"))
                                     .Add(Projections.Property("prop1")))

使用hql时

select c.Col1,c.Col2 from table c

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