HTML5技术

用DapperExtensions和反射来实现一个通用搜索 - yt1983

字号+ 作者:H5之家 来源:H5之家 2017-03-09 08:00 我要评论( )

前言 搜索功能是一个很常用的功能,当然这个搜索不是指全文检索,是指网站的后台管理系统或ERP系统列表的搜索功能。常见做法一般就是在搜索栏上加上几个常用字段来搜索。代码可能一般这样实现 StringBuilder sqlStr = new StringBuilder(); if (!string.IsNul

前言

  搜索功能是一个很常用的功能,当然这个搜索不是指全文检索,是指网站的后台管理系统或ERP系统列表的搜索功能。常见做法一般就是在搜索栏上加上几个常用字段来搜索。代码可能一般这样实现

StringBuilder sqlStr = new StringBuilder();
if (!string.IsNullOrEmpty(RealName))
{
    sqlStr.Append(" and RealName  = @RealName");
}
if (Age != -1)
{
    sqlStr.Append(" and Age = @Age");
}
if (!string.IsNullOrEmpty(StartTime))
{
    sqlStr.Append(" and CreateTime >= @StartTime");
}
if (!string.IsNullOrEmpty(EndTime))
{
    sqlStr.Append(" and CreateTime <= @EndTime");
}
MySqlParameter[] paras = new MySqlParameter[]{
            new MySqlParameter("@Age", Age),
            new MySqlParameter("@RealName", RealName),
            new MySqlParameter("@StartTime", StartTime),
            new MySqlParameter("@EndTime", EndTime)
        };

 这段代码如果遇到下面几个需求,又该如何处理?

可能大多数程序猿想法,这是新的需求,那么就直接改代码,简单粗暴。然后在前台加个age范围文本框,后台再加个if判断,realname的=号就直接改成like,就这样轻松搞定了。但需求总是不断变化,如果一张表有50个字段,同时需要支持其中40个字段查询。我想大都数人第一反应:卧槽,神经病!难道就没有一个通用的办法来解决这种搜索的问题?我想说当然有,本文接下来就用DapperExtensions和反射来解决这个问题,最终于实现的效果如下图:

DapperExtensions介绍

  DapperExtensions是基于Dapper的一个扩展,主要在Dapper基础上实现了CRUD的操作。它还提供了一个谓词系统,可以实现更多复杂的高级查询功能。还可以通过ClassMapper来定义实体类和表的映射。

通用搜索功能实现

1.首先创建一个account表,然后增加一个Account类

public class Account
    {
        public Account()
        {
            Age = -1;
        }
        /// <summary>
        /// 账户ID
        /// </summary>
        [Mark("账户ID")]
        public int AccountId { get; set; }
        /// <summary>
        /// 姓名
        /// </summary>
        [Mark("姓名")]
        public string RealName { get; set; }
        /// <summary>
        /// 年龄
        /// </summary>
        [Mark("年龄")]
        public int Age { get; set; }
        /// <summary>
        /// 创建时间
        /// </summary>
        [Mark("创建时间")]
        public DateTime CreateTime { get; set; }
    }

2.为了获取字段对应的中文名称,我们增加一个MarkAttribute类。因为有强大的反射功能,我们可以通过反射动态获取每张表实体类的属性和中文名称。

[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = true)] public class MarkAttribute : Attribute { public MarkAttribute(string FiledName, string Description = "") { this.FiledName = FiledName; this.Description = Description; } private string _FiledName; public string FiledName { get { return _FiledName; } set { _FiledName = value; } } private string _Description; public string Description { get { return _Description; } set { _Description = value; } } }

3.通用搜索思路主要是把搜索功能抽象出一个对象,本质上也就列名、操作符、值组成的一个对象集合,这样就可以实现多个搜索条件的组合。我们增加一个Predicate类

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • FormData+Ajax 实现多文件上传 学习使用FormData对象 - 天青色的西瓜莹

    FormData+Ajax 实现多文件上传 学习使用FormData对象 - 天青色的西瓜

    2017-03-08 18:01

  • css3实现圆角边框渐变 - 就只是小茗

    css3实现圆角边框渐变 - 就只是小茗

    2017-03-08 15:00

  • [前言] 实现一个Android电子书阅读APP - xfangs

    [前言] 实现一个Android电子书阅读APP - xfangs

    2017-03-04 09:03

  • HTML5动画(二):Canvas 实现圆形进度条并显示数字百分比 - 孟然

    HTML5动画(二):Canvas 实现圆形进度条并显示数字百分比 - 孟然

    2017-02-23 14:05

网友点评