使用NHibernate查询数据库的规范模式

使用NHibernate查询数据库的规范模式,nhibernate,specification-pattern,Nhibernate,Specification Pattern,如何使用NHibernate实现查询数据库的规范模式?(没有LINQ到NHibernate)。我读了很多关于规范模式的书,但大多数都是关于验证和查询内存集合对象的 就我所知,在规范界面中使用DetachedCriteria是最好的方法 interface ISpecification<T> { bool IsSatisfiedBy(T object); DetachedCriteria CreateCriteria(); } 接口规范{ 布尔满足(T对象); Detach

如何使用NHibernate实现查询数据库的规范模式?(没有LINQ到NHibernate)。我读了很多关于规范模式的书,但大多数都是关于验证和查询内存集合对象的

就我所知,在规范界面中使用DetachedCriteria是最好的方法

interface ISpecification<T> {

 bool IsSatisfiedBy(T object);

 DetachedCriteria CreateCriteria();

}
接口规范{
布尔满足(T对象);
DetachedCriteria CreateCriteria();
}

有没有其他或更好的方法可以做到这一点?

这不是必须的更好,但可以是一种替代方法

interface ISpecification<T> 
{
   bool IsSatisfiedBy(T object);

   Expression<Func<T, bool>> Predicate { get; }
}
接口规范
{
布尔满足(T对象);
表达式谓词{get;}
}

易于通过linq(到nhibernate)和内存集合使用。

我使用简单的扩展方法和规范模式实现了这一点,适用于System.linq.IQueryable列表

public interface IFilter<in T>
{
    bool MatchFilter(T o);
}

public static class FilterExtension
{
    public static IQueryable<T> Filter<T>(this IQueryable<T> query, IFilter<T> filter)
    {
        return query.Where(x => filter.MatchFilter(x));
    }
}
公共接口IFilter
{
布尔匹配滤波器(TO);
}
公共静态类筛选器扩展
{
公共静态IQueryable筛选器(此IQueryable查询,IFilter筛选器)
{
返回query.Where(x=>filter.MatchFilter(x));
}
}
简单示例类和IFilter实现:

public class Organization
{
    public string Name { get; set; }
    public string Code { get; set; }
    public Address Address { get; set; }


    public Organization(string name, string code, string city, string country)
    {
        Name = name;
        Code = code;
        Address = new Address(city, country);
    }

}

public class Address
{
    public Address(string city, string country)
    {
        City = city;
        Country = country;
    }

    public string City { get; set; }
    public string Country { get; set; }
}

public class GenericOrganizationFilter : IFilter<Organization>
{
    public string FilterString { get; set; }

    public GenericOrganizationFilter(string filterString)
    {
        FilterString = filterString;
    }

    public bool MatchFilter(Organization o)
    {
        return
            (o.Name != null && o.Name.Contains(FilterString)) ||
            (o.Code != null && o.Code.Contains(FilterString)) ||
            (o.Address != null && o.Address.City != null && o.Address.City.Contains(FilterString)) || 
            (o.Address != null && o.Address.Country != null && o.Address.Country.Contains(FilterString));
    }
}
公共类组织
{
公共字符串名称{get;set;}
公共字符串代码{get;set;}
公共广播地址{get;set;}
公共组织(字符串名称、字符串代码、字符串城市、字符串国家)
{
名称=名称;
代码=代码;
地址=新地址(城市、国家);
}
}
公共课堂演讲
{
公共广播(字符串城市、字符串国家)
{
城市=城市;
国家=国家;
}
公共字符串City{get;set;}
公共字符串国家{get;set;}
}
公共类GenericOrganizationFilter:IFilter
{
公共字符串筛选器字符串{get;set;}
公共GenericOrganizationFilter(字符串筛选器字符串)
{
FilterString=FilterString;
}
公共布尔匹配过滤器(组织o)
{
返回
(o.Name!=null&&o.Name.Contains(FilterString))||
(o.Code!=null&&o.Code.Contains(FilterString))||
(o.Address!=null&&o.Address.City!=null&&o.Address.City.Contains(FilterString))|
(o.Address!=null&&o.Address.Country!=null&&o.Address.Country.Contains(FilterString));
}
}
用法:

IFilter<Organization> filter = new GenericOrganizationFilter("search string");
//Assuming queryable is an instance of IQueryable<Organization>. 
IQueryable<Organization> filtered = queryable.Filter(filter);
IFilter过滤器=新的GenericOrganizationFilter(“搜索字符串”);
//假设queryable是IQueryable的一个实例。
IQueryable filtered=queryable.Filter(过滤器);

我如何在数据库上使用它?你能给我一个例子吗?返回MyISession.Linq().Where(specification.Preficate).ToList()我在我的代码中并没有这么简单地使用它,但我使用一个查询对象来添加对急切加载、排序、投影等的支持。让它有机会在SQL中执行过滤,谓词应该是一个
表达式
。我调查了一个类似的主题,发现这些帖子很有趣:和