我有一个通用的存储库,它可以全面运行
- 界面 -
public interface IRepository<T> : IEnumerable<T>, IQueryable<T>
{
...
...
...
}
- 实施 -
/// <summary>
/// Implementation of <see cref="IRepository"/>
/// </summary>
public class NHibernateRepository<T> : IRepository<T> where T : BaseEntity
{
readonly ISession _session;
protected IQuery CurrentHQLStatement { get; set; }
public NHibernateRepository(ISession session)
{
_session = session;
}
...
/*Other Code*/
...
}
因为接口实现了IEnumerable / IQueryablem,所以我们有一个Implied
_session.Where(Func键)
大多数(如果不是全部)代码都使用Where()来对单个表执行查询。
下面的项目,我有一个私有的get方法,它本质上是一个未来方法的实用方法,以及一个公共方法,它利用util方法获得先验代码的Precedent。
/// <summary>
/// Gets the precedent by the provide <![CDATA[Func<PrecedentEntity, bool>]]> delegate.
/// </summary>
/// <param name="func">The func.</param>
/// <returns></returns>
private IEnumerable<PrecedentEntity> GetPrecedentBy(Func<PrecedentEntity, bool> func)
{
if (func != null)
{
return _precedentRepo.Where(func);
}
else
{
return _precedentRepo.All();
}
}
/// <summary>
/// Gets the precedent.
/// </summary>
/// <param name="precedentCode">The precedent code.</param>
/// <returns></returns>
public PrecedentEntity GetPrecedent(string precedentCode)
{
return GetPrecedentBy(x => x.PrecedentCode == precedentCode).FirstOrDefault();
}
此方法适用于系统中的各个点,但仅在此实例中,SQL查询不会添加where子句,而是扫描整个表...
作为参考,映射也在下面。
/// <summary>
/// TODO: Update summary.
/// </summary>
public class Precedents : ClassMap<PrecedentEntity>
{
public Precedents()
{
Table("Precedents");
Id(x => x.PrecedentCode, "p_code").GeneratedBy.Assigned();
Map(x => x.Path, "p_prec_path");
Map(x => x.FileName, "p_prec_file");
Map(x => x.PackageCode, "p_pk_code");
Map(x => x.EntityCode, "p_en_code");
Map(x => x.IsWebViewable, "p_web_viewable").CustomType<TrueFalseTypeMapper>();
Map(x => x.ForceDocumentSelection, "p_sel_doc").CustomType<TrueFalseTypeMapper>();
}
}