将集合映射为可查询

时间:2012-12-20 19:28:22

标签: nhibernate fluent-nhibernate fluent-nhibernate-mapping

我已经习惯于在SQLAlchemy(Python)中使用lazy="dynamic"来映射关系/集合,它将属性映射为Query对象而不是填充的列表/集合(或延迟加载属性的代理)。然后,此映射属性允许您在执行此操作之前进一步细化用于获取集合的查询(应用顺序,限制,过滤等)。

例如,在SQLAlchemy中我可以映射这样的关系:

class Post(Base):
    ...

class User(Base):
    ...
    posts = relationship(Post, lazy="dynamic")

然后当我检索用户时,我可以在帖子上应用订单,或者只检索最后5个等等。

user = session.query(User).get(1)

# Fetch the last 5 posts by user 1
posts = user.posts.order_by(Post.create_date.desc()).limit(5).all()

http://docs.sqlalchemy.org/en/rel_0_7/orm/collections.html


我很想找到一种方法来使用Fluent NHibernate,将集合映射为QueryOver或IQueryable(LINQ),例如:

public virtual QueryOver<Post> Posts {get; set;}
or
public virtual IQueryable<Post> Posts { get; set; }

并在映射中执行以下操作:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        ...
        HasMany(u => u.Posts).Fetch.Dynamic
    }
}

目前使用Fluent NHibernate(或只是NHibernate)可以实现吗?

1 个答案:

答案 0 :(得分:0)

可以使用NHibernate,但它并不是开箱即用。

您需要编写自己的collectionwrapper来实现IQueryable,将其注入您自己的CollectionFactory并将查询生成委托给加载包含对象的会话。