2010-02-14 115 views
1
List<object[]> products = GetSession().CreateCriteria<Product>() 
      .SetProjection(Projections.ProjectionList() 
           .Add(Projections.Property("Id")) 
           .Add(Projections.Property("Name")) 
           .Add(Projections.Property("Price")) 
      ) 
      .List(); 
public class ProductRow 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public double Price { get; set; } 
} 

我怎样才能得到的结果作为List <ProductRow>类型类型化的类型?NHibernate的投影:如何获得使用标准API与投影

我看到有一个函数Projection.Cast,但我没有看到有关如何使用它的任何文档。

+0

porjection - > projection Ceritria - > Criteria – labilbe 2010-02-14 08:16:10

回答

3

您可以尝试设置结果变压器:

var result = GetSession() 
    .CreateCriteria<Product>() 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.Property("Id"), "Id") 
     .Add(Projections.Property("Name"), "Name") 
     .Add(Projections.Property("Price"), "Price") 
    ) 
    .SetResultTransformer(Transformers.AliasToBean<ProductRow>()) 
    .List<ProductRow>(); 

注意添加每个投影时指向ProductRow的属性别名的使用。

+0

'.Add(Projections.Property(“Category.Name”),“Category”)'在这种情况下我得到错误:'无法解析属性:类别。 Project.Domain.Model.Product的名称'。 – 2010-02-14 19:22:08

+0

我相信你需要为你的Category属性添加一个别名,而不是使用别名。因此,如果您使用AddAlias为“Category”提供别名“c”,则可以使用“c.Name”而不是“Category.Name”。 – Kristoffer 2010-06-16 20:44:47

-1

我一直没能找到解决这个问题的具体方法。几天前我发布了一个类似的问题。 (http://stackoverflow.com/questions/3921457/nhibernate-entity-access-through-projection)错误信息是因为NHibernate正在您的产品类中寻找一个名为Category的属性。我认为没有一个。迄今为止我所能找到的最近使用的是DTO。同样,使用表达式树,Lambda表达式和/或ExpressionSelector更深入地观察动态DTO生成器和动态LINQ到NHibernate。所有这些看起来都比较复杂。我希望有一个简单的解决方案来动态地设置实体,即,投影。