2015-12-25 56 views
0

目的:加入與自己的表

在表'預訂'行代表預訂的資源。 行可以共享'預留ID'。所以,如果你預訂了一些食物和房間,那將是兩行共享相同的預訂ID。

現在使用lambda表達式。如果這些行中有一個具有特殊的布爾值集合'let call it externBoolean'(如果這是真的)。我想要獲取該行和其他具有相同預留ID的行。 然後返回一個列表,其中包含所有在此布爾值和所有兄弟行中都爲true的行。

basicly是這樣的:

select t2.* 
from Reservations t1 
join Reservations t2 
on t1.ReservationId = t2.ReservationId 
where t1.externBoolean = 1 

但使用lambda表達式

答:隨着幫助下建議下面我結束了這個

它含有比quesiton多一點,但它的作品

var model1 = db.Pronestor_Internservice.Where(x => DbFunctions.TruncateTime 
(x.booking_start_time) >= startDate && DbFunctions.TruncateTime 
(x.booking_end_time) <= endDate && x.reservation_name.Contains(search_text) 
&& x.resource_category_id == 61) 
.Join(db.Pronestor_Internservice, x => x.reservation_id, x => 
x.reservation_id, (x, y) => y).ToList 
+0

你可以先給它一個鏡頭,然後在需要的地方幫忙嗎? – sstan

+0

我一直在爲它拍攝30分鐘.. 我不是lamdba好,我一直在谷歌上搜索所有的東西還挺 「加盟同桌」 「自我引用表」 我似乎無法找到我要找的。 – NoobCoder

+0

加入同一個表與加入兩個不同的表沒有區別。只需使用'context.MyTable'而不是使用'context.Table1'和'context.Table2'。 – MarcinJuraszek

回答

1

您可以使用Queryable.Join

var query = t1.Join(t2, x => x.ReservationId, x => x.ReservationId, (x, y) => new {First = x, Second = y}) 
    .Where(x => x.First.externBoolean == 1) 
    .Select(x => x.Second); 

或者

var query = t1.Where(x => x.externBoolean == 1) 
    .Join(t2, x => x.ReservationId, x => x.ReservationId, (x, y) => y); 
+0

我不明白你的替代​​版本。 y從哪裏來? – NoobCoder

+0

x表示第一個表中的行,y表示第二個表中的行。 '(x,y)=> y'是從第二個表中選擇行的選擇器。 – dotctor

+0

但你寫了兩次相同的東西。 x => x.ReservationId,x => x.ReservationId – NoobCoder

0

對於類:

public class Reservation 
{ 
    public int ReservationId { get; set; } 
    public bool ExternBoolean { get; set; } 
} 

您可以使用此代碼:

List<Reservation> result = reservations 
    .Where(r => r.ExternBoolean) 
    .Join(reservations, r1 => r1.ReservationId, r2 => r2.ReservationId, (r1, r2) => new { r1, r2 }) 
    .Select(pair => pair.r2) 
    .ToList(); 

R,R1和R2的lambda expressions的一部分。

您可以通過呼叫讀取此查詢。來源集合reservations過濾器值whereExternBoolean屬性爲真(對於集合檢查中的每個r)和join通過匹配屬性的相等性,每個過濾對象都進入同一集合的所有元素reservations(第1個參數)。

對於第一集合中的每個元素r1(過濾)得到預留ID屬性(第2參數)和第二集合中的每個元素r2reservations得到預留ID屬性(第三參數)太。

然後,對於兩個集合中屬性匹配的對,選擇具有2個字段的新匿名類r1r2

接下來從這個對集合中選擇每個元素pair只有第二個屬性r2(因爲r2包含一個與自身連接的元素r1)。

最後通過迭代ToList()來執行查詢。

+0

我不太明白說實話.. 你有r,r1和r2 .. – NoobCoder

+0

r,r1和r2是lambda表達式的一部分。我會更新我的答案。 –