Asp.net 에 서 는 DapperExtensions 와 반 사 를 사용 하여 일반적인 검색 을 실현 합 니 다.
12883 단어 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") :@Html.DropDownList("operatorItems") :@Html.TextBox("value")
<input id="btnAdd" type="button" value=" " /> <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 와 반 사 를 사용 하여 유 니 버 설 검색 을 실현 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 은 제때에 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
java 반사에 근거하여 대상 속성 값을 얻는 방법본고는 자바가 반사를 바탕으로 대상의 속성 값을 얻는 방법을 실례로 서술하였다.다음과 같이 여러분에게 참고할 수 있도록 공유합니다. 반사 메커니즘을 통해 대상의 속성과 속성 값을 얻을 수 있습니다. 대상에서priva...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.