使用NHibernate查询数据库的规范模式
如何使用NHibernate实现查询数据库的规范模式?(没有LINQ到NHibernate)。我读了很多关于规范模式的书,但大多数都是关于验证和查询内存集合对象的 就我所知,在规范界面中使用DetachedCriteria是最好的方法使用NHibernate查询数据库的规范模式,nhibernate,specification-pattern,Nhibernate,Specification Pattern,如何使用NHibernate实现查询数据库的规范模式?(没有LINQ到NHibernate)。我读了很多关于规范模式的书,但大多数都是关于验证和查询内存集合对象的 就我所知,在规范界面中使用DetachedCriteria是最好的方法 interface ISpecification<T> { bool IsSatisfiedBy(T object); DetachedCriteria CreateCriteria(); } 接口规范{ 布尔满足(T对象); Detach
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中执行过滤,谓词应该是一个表达式
。我调查了一个类似的主题,发现这些帖子很有趣:和