加入 LINQ和Lambda的位置

2021-10-02 15:09:13 字數 4217 閱讀 2692

我在使用linq和lambda編寫的查詢時遇到問題。 到目前為止,我的****現了很多錯誤:

int id = 1;

var query = database.posts.join(database.post_metas,

post => database.posts.where(x => x.id == id),

meta => database.post_metas.where(x => x.post_id == id),

(post, meta) => new );

我是新手使用linq,所以我不確定這個查詢是否正確。

我發現,如果您熟悉sql語法,那麼使用linq查詢語法會更清晰,更自然,並且更容易發現錯誤:

var id = 1;

var query =

from post in database.posts

join meta in database.post_metas on post.id equals meta.post_id

where post.id == id

select new ;

如果你真的堅持使用lambdas,你的語法有點偏。 這是使用linq擴充套件方法的相同查詢:

var id = 1;

var query = database.posts // your starting point - table in the "from" statement

.join(database.post_metas, // the source table of the inner join

post => post.id, // select the primary key (the first part of the "on" clause in an sql "join" statement)

meta => meta.post_id, // select the foreign key (the second part of the "on" clause)

(post, meta) => new ) // selection

.where(postandmeta => postandmeta.post.id == id); // where statement

var query = database.posts.join(database.post_metas,

post => post.id,

meta => meta.post_id,

(post, meta) => new );

您可以在之後應用where子句,而不是作為鍵選擇器的一部分。

你可以用兩種方式。 使用linqpad (如果您是linq的新手,這是非常寶貴的)和虛擬資料庫,我構建了以下查詢:

posts.join(

post_metas,

post => post.post_id,

meta => meta.post_id,

(post, meta) => new

)

要麼

from p in posts

join pm in post_metas on p.post_id equals pm.post_id

select new

在這種特殊情況下,我認為linq語法更清晰(我在兩者之間進行了更改,具體取決於最容易閱讀的內容)。

我想指出的是,如果你的資料庫中有適當的外來鍵(post和post_meta之間),那麼你可能不需要顯式連線,除非你試圖載入大量的記錄。 您的示例似乎表明您正在嘗試載入單個帖子及其元資料。 假設每個帖子都有很多post_meta記錄,那麼您可以執行以下操作:

var post = posts.single(p => p.id == 1);

var metas = post.post_metas.tolist();

如果你想避免n + 1問題,那麼你可以明確地告訴linq to sql一次性載入所有相關專案(儘管這可能是你更熟悉l2s時的乙個高階主題)。 下面的示例說明「當您載入post時,還會通過'post_metas'屬性表示的外來鍵載入與其關聯的所有記錄」:

var dataloadoptions = new dataloadoptions();

dataloadoptions.loadwith(p => p.post_metas);

var datacontext = new mydatacontext();

datacontext.loadoptions = dataloadoptions;

var post = posts.single(p => p.id == 1); // post_metas loaded automagically

對於相同型別或許多不同型別,可以在單個dataloadoptions集上進行許多loadwith呼叫。 如果你這麼做,你可能只想考慮快取。

它可能是這樣的

var myvar = from a in context.myentity

join b in context.myentity2 on a.key equals b.key

select new ;

發布是因為當我開始linq + entityframework時,我盯著這些例子一天。

如果您正在使用entityframework,並且在post模型物件設定上有乙個名為meta的導航屬性,那麼這很容易。 如果您正在使用實體並且沒有該導航屬性,您還在等什麼?

database

.posts

.where(post => post.id == id)

.select(post => new );

如果你先做**,你就這樣設定了屬性:

class post 

public int metaid

public virtual meta meta

}

daniel對語法關係有乙個很好的解釋,但我把這個文件放在我的團隊中,以便讓他們更容易理解。 希望這有助於某人 這個linq查詢應該適合你。 它將獲得所有發布元的帖子。

var query = database.posts.join(database.post_metas,

post => post.postid, // primary key

meta => meat.postid, // foreign key

(post, meta) => new );

等效的sql查詢

select * from posts p

inner join post_metas pm on pm.postid=p.postid

我做過這樣的事情;

var certificationclass = _db.individuallicenses

.join(_db.indlicenseclasses,

il => il.license_class,

ilc => ilc.name,

(il, ilc) => new )

.where(o =>

o.individuallicense.globalentityid == "abc" &&

o.individuallicense.license_type == "abc")

.select(t => new

).orderby(x => x.name);

1等於1兩個不同的表連線

var query = from post in database.posts

join meta in database.post_metas on 1 equals 1

where post.id == id

select new ;

linq和lambda基本操作

一 linq有兩種語法 1 方法語法 2 查詢語法 下面舉個例子看看這兩種方法的區別 比如現在有乙個學生類 public class student public int age public string 我們通過乙個方法來新增很多同學 public ilistgetstu int n retur...

LINQ和Lambda表示式

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

關於LINQ 和lambda表示式

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