2011-02-26 30 views
1

我想查询一个nhibernate映射的类,但结果应该是一个未映射的对象。该映射和未映射类是这样的:NHibernate查询使用Criteria-api返回未映射的对象

[Class(NameType = typeof(ClassA)] 
public class ClassA 
{ 
    [Cache(0, Usage = CacheUsage.ReadWrite)] 
    [Id(1, Name = "Id", UnsavedValue = null)] 
    [Generator(2, Class = "native")] 
    public virtual long? Id { get; set; } 

    [Property] 
    public virtual string PropertyA { get; set; } 

    [Property] 
    public virtual string PropertyB { get; set; } 

} 

public class ClassB 
{ 
    public string PropertyA { get; set; } 

    public string PropertyB { get; set; } 

    public int Number { get; set; } 
} 

而且我用这个方法来得到我想要的结果:

public ICollection<ClassB> Group() 
{ 
    var result = 
     Session.CreateCriteria(typeof(ClassA)).SetProjection(
      Projections.ProjectionList().Add(Projections.RowCount(), "Number") 
        .Add(Projections.GroupProperty("PropertyA")) 
        .Add(Projections.GroupProperty("PropertyB"))); 

    return 
     (result.List().Cast<IList>().Select(
      entry => 
      new ClassB { 
         Number = (int)entry[0], 
         PropertyA = (string)entry[1], 
         PropertyB = (string)entry[2] 
        } 
      )).ToList(); 
} 

这工作得很好,但是是不是有一个更直接的办法这使用criteria-api?

回答

6

是刚做

result.SetResultTransformer(Transformers.AliasToBean<ClassB>()); 
result.List<ClassB>(); 

您还需要来包装你的财产作为预测别名 Projections.Alias(Projections.GroupProperty("PropertyA"), "PropertyA")

+0

谢谢,完美的作品。我只是给了预测一个explixit别名来使它工作,像这样:'.Add(Projections.GroupProperty(“PropertyA”),“PropertyA”)' – 2011-02-26 17:57:23

+0

@Rian,啊,是的,忘记了这一点。将编辑我的答案。 – Vadim 2011-02-26 18:57:43