【问题标题】:NHibernate QueryOver projection on many-to-oneNHibernate QueryOver 多对一投影
【发布时间】:2015-01-02 20:06:08
【问题描述】:

我正在尝试让QueryOver 在many-to-one 上使用投影工作。

“Post”类有一个属性many-to-one“Creator”。

使用

session.QueryOver(Of Post).
Select(Projections.
Property(of Post)(Function(x) x.Creator).
WithAlias(Function() postAlias.Creator)).
TransformUsing(Transformers.AliasToBean(Of Post)()).
List()

工作但每个创建者都通过单个查询检索,而不是像不使用选择/投影时那样使用连接。因此,如果有 5 个帖子有 5 个不同的创建者,则将运行 6 个查询,其中 1 个用于帖子列表,5 个用于创建者。

我尝试使用 JoinAlias 让它工作,但没有真正完成这项工作。

我已经搜索了一个解决方案,但我找到的所有解决方案都使用了 Linq-Provider,它并不适合,因为实际的“字段列表”是通过参数传递的。

有谁知道除了 linq 提供者之外是否有解决方案?

【问题讨论】:

    标签: nhibernate projection queryover


    【解决方案1】:

    有一个解决方案,我们可以为many-to-one 使用projections,然后自定义结果转换器。

    免责声明:我会看VB语法,但没有足够的勇气写……我希望你能看懂C#并把它转换成VB……

    所以我们可以有这样的投影:

    // aliases
    Post root = null;
    Creator creator = null;
    
    // projection list
    var columns = Projections.ProjectionList();
    
    // root properties
    columns.Add(Projections.Property(() => root.ID).As("ID"));
    columns.Add(Projections.Property(() => root.Text).As("Text"));
    
    // reference properties
    columns.Add(Projections.Property(() => creator.ID).As("Creator.ID"));
    columns.Add(Projections.Property(() => creator.FirstName).As("Creator.FirstName"));
    
    // so our projections now do have proper ALIAS
    // alias which is related to domain model 
    //  (because "Creator.FirstName" will be use in reflection)
    
    var query = session.QueryOver<Post>(() => root)
        .JoinAlias(() => root.Creator, () => creator)
        .Select(columns)
    

    现在我们需要智能Transformer,我们自己的客户(可插入性是NHibernate 的强大功能)。在这里你可以找到一个:

    public class DeepTransformer

    我们可以这样继续下去

    var list = query
        .TransformUsing(new DeepTransformer<Post>())
        .List<Post>()
    

    也检查一下:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多