Asp.net 에 서 는 DapperExtensions 와 반 사 를 사용 하여 일반적인 검색 을 실현 합 니 다.

머리말
검색 기능 은 매우 자주 사용 하 는 기능 이다.물론 이 검색 은 전체 텍스트 검색 이 아니 라 사이트 의 배경 관리 시스템 이나 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)
    };
 이 코드 가 아래 의 몇 가지 요 구 를 만나면 어떻게 처리 해 야 합 니까?
4.567917.조회 필드 를 하나 더 추가 합 니 다.4.567918.
RealName 을 모호 한 조회 로 바 꿔 야 합 니 다연령 지원 범위 조회 필요아마도 대부분의 프로그램 원숭이 들 은 이것 이 새로운 수요 라 고 생각 할 것 이다.그러면 코드 를 직접 바 꾸 고 간단 하고 거칠다.그리고 프론트 데스크 에 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 류 를 추가 합 니 다.

public class Predicate
  {
    /// <summary>
    ///   
    /// </summary>
    public string ColumnItem { get; set; }
    /// <summary>
    ///    
    /// </summary>
    public string OperatorItem { get; set; }
    /// <summary>
    ///  
    /// </summary>
    public object Value { get; set; }
  }
4.그리고 Account 클래스 의 속성 을 반사 하여 프론트 데스크 톱 이름 의 DropDownlList 에 불 러 오고,연산 자의 DropDownlList 를 추가 합 니 다.

var columnItems = new List<SelectListItem>();
      //           
      Type t = Assembly.Load("SearchDemo").GetType("SearchDemo.Models.Account");
      foreach (PropertyInfo item in t.GetProperties())
      {
        string filedName = (item.GetCustomAttributes(typeof(MarkAttribute), false)[0] as MarkAttribute).FiledName;
        columnItems.Add(new SelectListItem() { Text = filedName, Value = item.Name });
      }
      ViewBag.columnItems = columnItems;
      var operatorItems = new List<SelectListItem>()
      {
        new SelectListItem() {Text = "  ", Value = "Eq"},
        new SelectListItem() {Text = "  ", Value = "Gt"},
        new SelectListItem() {Text = "     ", Value = "Ge"},
        new SelectListItem() {Text = "  ", Value = "Lt"},
        new SelectListItem() {Text = "     ", Value = "Le"},
        new SelectListItem() {Text = "  ", Value = "Like"}
      };
      ViewBag.operatorItems = operatorItems;
 5.프론트 인터페이스 구현 코드

<!DOCTYPE html>
<html>
<head>
  <title>DapperExtensions    </title>
  <script src="../../Scripts/jquery-1.4.4.min.js" type="text/javascript"></script>
  <script type="text/javascript">
    Date.prototype.format = function (format) {
      var o = {
        "M+": this.getMonth() + 1, //month  
        "d+": this.getDate(), //day  
        "h+": this.getHours(), //hour  
        "m+": this.getMinutes(), //minute  
        "s+": this.getSeconds(), //second  
        "q+": Math.floor((this.getMonth() + 3) / 3), //quarter  
        "S": this.getMilliseconds() //millisecond  
      }
      if (/(y+)/.test(format)) {
        format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
      }
      for (var k in o) {
        if (new RegExp("(" + k + ")").test(format)) {
          format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
        }
      }
      return format;
    } 
  </script>
  <style type="text/css">
    ul
    {
      list-style: none;
      padding: 0px;
      margin: 0px;
      width: 590px;
      height: 20px;
      line-height: 20px;
      border: 1px solid #99CC00;
      border-top: 0px;
      font-size: 12px;
    }
    ul li
    {
      display: block;
      width: 25%;
      float: left;
      text-indent: 2em;
    }
    .th
    {
      background: #F1FADE;
      font-weight: bold;
      border-top: 1px solid #99CC00;
    }
  </style>
  <script type="text/javascript">
    var predicates = [];
    var index = 0;
    $(document).ready(function () {
      $("#btnAdd").click(function () {
        var columnItem = $("#columnItems option:selected");
        var operatorItem = $("#operatorItems option:selected");
        var value = $("#value").val();
        if(value == ""){
          alert("    ");
          return;
        }
        var predicate = { index: index, columnItem: columnItem.val(), operatorItem: operatorItem.val(), value: value };
        predicates.push(predicate);
        var html = "<ul><li>" + columnItem.text() + "</li><li>" + operatorItem.text() + "</li><li>" + value + "</li><li><a href='javascript:;' onclick='del(this," + index + ")'>  </a></li></ul>"
        $("#predicates ul:last").after(html);
        index++;
      })
      $("#btnSearch").click(function () {
        $.ajax({
          type: "POST",
          url: "home/search",
          data: JSON.stringify(predicates),
          contentType: "application/json",
          success: function (data) {
            if (data.Error != null) {
              alert(data.Error);
              return;
            }
            $("#list .th").nextAll().remove();
            var html = "";
            $.each(data, function (index, item) {
              html += "<ul><li>" + item.AccountId + "</li>";
              html += "<li>" + item.RealName + "</li>";
              html += "<li>" + item.Age + "</li>";
              //    
              var dateMilliseconds = parseInt(item.CreateTime.replace(/\D/igm, ""));
              var date = new Date(dateMilliseconds);
              html += "<li>" + date.format("yyyy-MM-dd hh:mm:ss") + "</li></ul>";
            });
            $("#list .th").after(html);
          }
        });
      })
    })
    function del(obj,index) {
      obj.parentNode.parentNode.remove();
      for (var i = 0; i < predicates.length; i++) {
        if (predicates[i].index == index) {
          predicates.splice(i, 1);
        }
      }
    }
  </script>
</head>
<body>
  <div>
      :@Html.DropDownList("columnItems")&nbsp;&nbsp;   :@Html.DropDownList("operatorItems")&nbsp;&nbsp; :@Html.TextBox("value")&nbsp;&nbsp;
    <input id="btnAdd" type="button" value="  " />&nbsp;&nbsp;<input id="btnSearch" type="button" value="  " />
  </div>
  <br />
  <div id="predicates">
    <ul class="th">
      <li>  </li>
      <li>   </li>
      <li> </li>
      <li>  </li>
    </ul>
  </div>
  <br />
  <div id="list">
    <ul class="th">
      <li>  ID</li>
      <li>  </li>
      <li>  </li>
      <li>    </li>
    </ul>  
  </div>
</body>
</html>
 6.마지막 으로 DapperExtensions 의 서술 어 와 반 사 를 통 해 검색 방법 을 실현 한다.

 [HttpPost]
    public JsonResult Search(List<Predicate> predicates)
    {
      if (predicates == null)
      {
        return Json(new { Error = "       " });
      }
      using (var connection = SqlHelper.GetConnection())
      {
        var pga = new PredicateGroup { Operator = GroupOperator.And, Predicates = new List<IPredicate>() };
        foreach (var p in predicates)
        {
          var predicate = Predicates.Field<Account>(GetExpression(p), (Operator)Enum.Parse(typeof(Operator), p.OperatorItem), p.Value);
          pga.Predicates.Add(predicate);
        }
        var list = connection.GetList<Account>(pga);
        return Json(list);
      }
    }
    private static Expression<Func<Account, object>> GetExpression(Predicate p)
    {
      ParameterExpression parameter = Expression.Parameter(typeof(Account), "p");
      return Expression.Lambda<Func<Account, object>>(Expression.Convert(Expression.Property(parameter, p.ColumnItem), typeof(object)), parameter);
    }
마지막 으로 간단 한 몇 줄 코드 를 통 해 DapperExtensions 의 기능 을 바탕 으로 우 리 는 여러 필드,여러 조건,여러 조작 자 를 지원 할 수 있 는 유 니 버 설 조회 기능 을 실현 했다.본 고 는 벽돌 을 던 져 옥 을 끌 어 올 리 는 것 일 뿐 하나의 사고방식 을 제공 할 뿐 더 많은 세부 사항 을 고려 하지 않 았 다.예 를 들 어 여러 조건 의 조합 은 논리 적 인 부 호 를 하나 더 추가 하여 연결 할 수 있 고 여러 조건 의 조합 이 포 함 된 조회,다 중 표 조회 등 이다.
위 에서 말 한 것 은 편집장 이 소개 한 Asp.net 에서 DapperExtensions 와 반 사 를 사용 하여 유 니 버 설 검색 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기