Where子句不适用于NHibernate中的单个实体

时间:2013-07-18 14:15:17

标签: sql nhibernate fluent-nhibernate informix

我有一个通用的存储库,它可以全面运行

- 界面 -

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>();

    }
}

0 个答案:

没有答案