1.準備資料實體
publicclass
data
public
int count
}
建立測試資料
publicstatic listgettestdata()
;data account1 = new
data
;data account2 = new
data
;data account3 = new
data
;data account4 = new
data
;var rel = new list;
return
rel;
}
2.準備查詢條件實體
publicclass
condition
[dynamicexpression(name = "
count
", operator = "
>")]
public
int? age
}
資料實體2個字段乙個帳號乙個年齡大小
查詢條件2個字段乙個姓名(name帳號)乙個年齡(age)
為了確保查詢欄位和資料字段名字保持一直 引用乙個自定義特性 在查詢條件的每個字段上面標記
自定義特性包含2個字段乙個name 需要跟資料實體保持一致的名稱(注:必須和資料實體的字段對應) operator 表示運算邏輯符
附自定義實體**
[attributeusage(attributetargets.property | attributetargets.class, allowmultiple = true)]
public
class
dynamicexpressionattribute : attribute
//////
執行符號
/// public
string operator
}
從查詢條件中提取特效值的擴充套件類
publicstatic
class customattributeextensionwhere
tattribute : attribute
return
cache[key];
}//////
獲取customattribute value
/// ///
實體物件資料型別
///返回attribute的值,沒有則返回null
public
static
tattribute getcustomattributevalue(type sourcetype)
return
cache[key];
}//////
獲取實體類上的特性
/// ///
實體物件型別
///返回attribute的值,沒有則返回null
private
static
tattribute getclassattributes(type type)
//////
獲取實體屬性上的特性
/// ///
屬性資訊
///返回attribute的值,沒有則返回null
private
static
tattribute getpropertyattributes(propertyinfo propertyinfo)
//////
快取attribute value
///實體物件型別
///實體物件屬性資訊
///private
static
void
cacheattributevalue(type type, propertyinfo propertyinfo)
else
lock (key + "
_attributevaluelockkey")}}
//////
快取collection name key
///type
///propertyinfo
///private
static
string
buildkey(type type, propertyinfo propertyinfo)
return type.fullname + "
." +propertyinfo.name;
}}
根據資料和查詢條件生成表示式
publicstatic funcbool> getdynamicexpression(this ienumerabledata, tcondition condtion)
where tresult : class
where tcondition : class
), expression.constant(value)); ;
break
;
default
: filter =expression.equal(left, right);
break
; }
totalexpr =expression.and(filter, totalexpr);}}
var predicate =expression.lambda(totalexpr, param);
vardynamic = (funcbool>)predicate.compile();
return
dynamic
; }
測試 : (查詢帳號包含1的資料)
publicstatic
void
test()
;var dynamicexpression =getdynamicexpression(data, codition);
var query1 =data.where(dynamicexpression);
}
動態LINQ(Lambda表示式)構建
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!最近一直都忙於專案也沒什麼時間好好總結一下自己在專案中或平時的收穫 大家都知道現在為了提高開發效率,有關於和資料庫互動方面的部分我們一般都會用orm框架,例如entityframework,nhiberhate,linq to sql等,所以我們隊...
初識linq,lambda表示式
linq是微軟提供的一堆擴充套件方法。通過例子熟悉。對int陣列元素進行篩選 int values ienumerable e1 values.where i i 10 foreach int i in e1 可以用var進行型別推斷,過濾掉負數,把陣列排序,然後元素兩邊加 輸出簡化 var e1 ...
Linq lambda表示式經驗總結
linq有很多值得學習的地方,這裡我們主要介紹linq lambda表示式,包括介紹expression tree等方面。linq lambda表示式 了解過c 3.0的新特性的話應該知道,在c 3.0中新引入了乙個語法結構,稱為lambda expression linq lambda表示式 匿名...