關於LINQ 和lambda表示式

2021-07-11 18:28:57 字數 3062 閱讀 4122

一linq :    既可以實現過濾資料(和lambda一樣)也可以實現查詢其他型別資料的功能 linq表示式的from行可以巢狀  實現表多層關聯一層層向下找的目的  (注意一對一還是一對多的對應關係 容易亂  別把上層過濾掉的內容又關聯回來了)   過濾完要tolist() 不然是iqueryable型別

var actionlist= from r in userinfo.roleinfo     //等號前後型別不一樣  把使用者型別變成角色型別又變成許可權型別了(通過導航屬性)

from a in r.actioninfo

where a.actiontypeenum == actiontypeenum

select a;

二 lambda :

作為delegate的更進一步的應用,lambda讓我們的**更加的簡介與方便,可以方便的用where()、select()等擴充套件方法對集合進行篩選,組合。但同時也遇到了乙個問題,有時候,因為使用者想要進行的條件並不是固定不便的,有時候會這麼查,有時候又會組合查,同時,有時候因為資料庫設計的原因,有的字段拼接成乙個很長的字串,但是這時又要進行查詢,只要與條件有交集,那麼就要提取出這條記錄,所以必須要用到動態構建lambda表示式。

但是作為一種靜態語言,我們顯然無法用動態語法或者拼接字串的方式來建立乙個delegate/lambda,那麼如何才能達到類似的目的呢?或許最佳的選擇就是表示式樹。  

我們都知道lambda的樣子是這樣的

i = > i < 5

在這個lambda表示式中,i被成為parameter,< 叫做操作符,以及乙個常數 5,這樣就構建了乙個lambda表示式,那麼ms專門提供了一些類來讓我們可以手工建立。

首先需要引入命名空間

using system.linq.expressions.expression;

建立乙個陣列用來當做例子

var ints = new int ;

// 要建立形如 i => i < 5

//建立引數 i

var parameter  = expression.parameter(typeof(int),」i」);

//建立常數 5

var constant = expression.constant(5);

//建立 i > 5

var bin = expression.greaterthan(parameter,constant);

//獲取lambda表示式

var lambda=expression.lambda>(bin,parameter);

//取得查詢結果

var query = ints.where(lambda.compile());

到這裡就完成了一次結果的查詢,此時在程式中通過下斷點的方式來檢視我們構造的表示式是否正確。

接下來建立更加複雜一些的表示式

binaryexpression condition = null;

//要構造的表示式i==1||i==2||i==3.....

for (int i = 0; i < ints.length; i++)

else

}expression> lambda = expression.lambda>(condition, parameter);

因為現在用實體類,那麼如果是實體類進行構造的話需要這樣來做

//p => p.name == "1" && p.address == "2"

parameterexpression parameter1 = expression.parameter(typeof(person), "p");

constantexpression constant1 = expression.constant("1");

constantexpression constant2 = expression.constant("1");

memberexpression member = expression.propertyorfield(parameter1, "name");

var query1 = expression.equal(member, constant1);

var query2 = expression.equal(expression.propertyorfield(parameter1, "address"), constant2);

var query = expression.and(query1, query2);

var lambda1 = expression.lambda>(query, parameter1);

var list = methodextend.getuser(lambda1.compile());

工具擴充套件類: 原文:

1

public

static

class

expressionext27

public

static expressionbool>> or(this expressionbool>> expr1,expressionbool>>expr2)

811 }

那現在我們通過上面的擴充套件方法,再來優化一下我們最初舉的例子看下:

1 expressionbool>> exp1 = s => s.username.contains("

1") && s.age > 0

;2 expressionbool>> exp2 =exp1.and( s => s.isenable == 1);3

using (var context = new

dbcontext().connectionstring(connstring))

4

對於過濾前後型別一樣的情況可以使用  僅僅起過濾作用 不改變型別 過濾完要tolist() 不然是iqueryable型別

var usermenuactionlist = useractionlist.where(a => a.actiontypeenum == actiontypeenum).tolist();                 //等號前後型別一樣

LINQ和Lambda表示式

前段時間接觸了一種新的表示式,但是不知道這個是什麼意思,所以就先站在巨人的肩膀用了,現在聽師哥說這種寫法是 lambda 表示式。我一直以為,這個 lambda 表示式和 linq 查詢有異曲同工之妙,可惜,這樣想就大錯特錯了。定義語言整合查詢 language integrated query 允...

Linq語句和Lambda表示式

linq即語言整合查詢,是.net framework 3.5中新增的功能。其功能類似於資料庫中的sql語句 實際上linq就是針對.net framework的sql 提供標準的 易於學習的查詢和更新資料模式。從from開始 用過sql的朋友都知道,最簡單的sql語句select record f...

LINQ與Lambda表示式

是微軟提出的一項新技術 能將查詢功能直接引入到.net framwork所支援的程式語言中。查詢操作可以通過程式語言自身來傳達,而不用以字串形式嵌入到 中。主要包括linq to sql,linq to dataset,linq to objects和linq to xml4種技術。在c 後期版本中...