動態LINQ(Lambda表示式)

2022-07-03 17:42:08 字數 3211 閱讀 7319

1.準備資料實體

public

class

data

public

int count

}

建立測試資料

public

static listgettestdata()

;data account1 = new

data

;data account2 = new

data

;data account3 = new

data

;data account4 = new

data

;var rel = new list;

return

rel;

}

2.準備查詢條件實體

public

class

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

}

從查詢條件中提取特效值的擴充套件類

public

static

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;

}}

根據資料和查詢條件生成表示式

public

static 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的資料)

public

static

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表示式 匿名...