C# NHibernate查询建模

C# NHibernate查询建模,c#,.net,nhibernate,architecture,C#,.net,Nhibernate,Architecture,通常我会将criterias/hql查询放在与实体相关的repository/dal类中,但最近我一直在考虑添加另一个表示查询是什么的抽象,这将使我有可能向基类中的所有查询添加通用行为(例如分页),等等 这些就是我现在的组件 与nhibernate无关的通用接口: public interface IQuery<T> { IList<T> List(); T Single(); } 公共接口iquiry { IList列表(); T单(); } 基于条

通常我会将criterias/hql查询放在与实体相关的repository/dal类中,但最近我一直在考虑添加另一个表示查询是什么的抽象,这将使我有可能向基类中的所有查询添加通用行为(例如分页),等等

这些就是我现在的组件

与nhibernate无关的通用接口:

public interface IQuery<T>
{
    IList<T> List();
    T Single();
}
公共接口iquiry
{
IList列表();
T单();
}
基于条件的查询的示例实现,可以使用Hql查询或nhibernate linq查询执行类似的操作

public abstract class CriteriaQuery<T>: IQuery<T>
{
    [Inject]
    public ISessionFactory SessionFactory { protected get; set; }

    protected ISession Session
    {
        get { return SessionFactory.GetCurrentSession(); }
    }

    protected abstract ICriteria Configure(ICriteria criteria);

    [Transaction]
    public virtual IList<T> List()
    {
        var criteria = Session.CreateCriteria(typeof (T));

        return Configure(criteria)
                 .List<T>();
    }

    [Transaction]
    public virtual T Single()
    {
        return Configure(Session.CreateCriteria(typeof(T)))
                .UniqueResult<T>();
    }
}
公共抽象类标准查询:IQuery
{
[注入]
public ISessionFactory SessionFactory{protected get;set;}
受保护的会话会话
{
获取{return SessionFactory.GetCurrentSession();}
}
受保护的抽象ICriteria配置(ICriteria标准);
[交易]
公共虚拟IList列表()
{
var-criteria=Session.CreateCriteria(typeof(T));
返回配置(标准)
.List();
}
[交易]
公共虚拟T单()
{
返回Configure(Session.CreateCriteria(typeof(T)))
.UniqueResult();
}
}
在这里,特定于域的查询如下所示:

public interface IGetVideosQuery: IQuery<Video>
{
    IGetVideosQuery Page(int index);
    IGetVideosQuery PageSize(int pageSize);

    IGetVideosQuery AllTime { get; }
    IGetVideosQuery Today { get; }
    IGetVideosQuery LastWeek { get; }
}
公共接口IGETVIDESQUERY:IQuery
{
IGetVideosQuery页面(int索引);
IGetVideosQuery PageSize(int PageSize);
IGetVideosQuery ALLTY{get;}
今天我的意识形态{get;}
IGETVIDESORY上周{get;}
}
有什么想法吗?你知道我可能会遇到什么问题吗?
谢谢

我的第一个建议是使用Linq2NH,它在NHibernate 2.1及更高版本中提供。会话公开了一个
AsQueryable()
方法,您可以在该方法上构建Linq查询。这将允许您使用标准Linq扩展方法,包括Skip()和Take()来实现分页(
myQuery.Skip(PageIdx*PageSize)、Take(PageSize.ToList()
),以及要筛选的Where子句,随意附加条件和投影。这些查询中使用的lambda和变量可以封装在某种QueryInfo类中,允许重复的、持久的查询。

我选择了另一条路径,即。这将把我的变异逻辑和查询逻辑分开

现在,关于如何实现这一点,有不同的想法,我选择这一个:

  • 我所有的变异逻辑都是使用类似于
    DeactivateUser
    changelationaddress
    的命令激活的。对于这种业务逻辑,我有您描述的普通存储库

  • 为了显示数据,我使用了一个完全受管理的系统。在这个系统中,我描述了如下查询。我描述了基表和字段。查询系统会自动为我创建连接,并使用过滤器定义提供过滤器

该系统允许我降低存储库的复杂性,因为我不必考虑用户可能设置的过滤器或按排序。显示此数据的系统使用
标准自动创建过滤器
,并为我处理分页


也许这样的系统可以为您工作。

请查看Fabio Maulo的“增强”查询对象,了解一个相关的构造: