我在使用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...