2015-04-26 76 views
0

我有兩個EF類 - 一個叫event,另一個叫userLINQ to Entity,具有導航屬性的子查詢

event包含許多與正在運行的事件相關的字段,並且已經由Entity Framework(v6我認爲)生成。 user模擬用戶對象。

event包含導航屬性,該屬性是已註冊參加活動的用戶的列表。

我想要做的是過濾用戶列表,使其包含或者沒有條目(user_id x沒有預訂),或者它包含一個條目(user_id x did book)。

我目前所面對的是什麼:

var evts = context.events.Where(e=>event_id<10);列出的前十個事件。

events有一個導航屬性,名爲user_bookings這是一個列表user - 如何過濾用戶,以便我只能附加用戶提供的user_id?

編輯

爲了澄清(我不認爲我的工作做得很好解釋) - 我想事件列表,無論用戶是否已註冊了事件與否。我想要做的是將LINQ返回的用戶列表限制爲沒有用戶(當前用戶尚未預定此事件)或一個用戶(當前用戶已預訂它)。

+0

沒有與像context.users.Where的問題(X => x.Events.Count <= 1 )? – InferOn

+0

我想要替換的東西類似於這個SQL:'select e。*,(event_user_booking b中的select count(*),其中e.event_id = b.event_id和[email protected]_id)來自事件e e.event_id <10' 由於Entity Framework創建了我的對象,因此表event_user_booking不作爲對象包含在內,因爲它只是查找表來解決事件和用戶之間的多種關係。 –

回答

1

要獲得事件的完整列表,與給定user_id用戶,同時指示用戶是否已經預訂了該事件,您可以執行以下操作:

var user_id = 10; // example 
var query = 
    from evt in context.events 
    select new { 
     Event = evt, 
     HasBooked = evt.user_bookings.Any(x => x.user_id == user_id) 
    }; 

如果你想限制這種到最大event_id(例如所有比10更小),則可以修改此給:

var user_id = 10; // example 
var event_id_upper_limit = 10; 
var query = 
    from evt in context.events 
    where evt.event_id < event_id_upper_limit 
    select new { 
     Event = evt, 
     HasBooked = evt.user_bookings.Any(x => x.user_id == user_id) 
    }; 
+0

嗨。我所追求的是一個完整的事件列表,以及user_bookings結果中的零個或一個用戶。 我希望能夠顯示事件列表以及根據特定用戶是否已經註冊說明「註冊」或「註冊」的鏈接。 我在這裏第一次使用EF,LINQ和MVC--試圖儘可能地用盡可能少的代碼來實現。 (我一直認爲SQL很好,可以做到這一點沒有問題,但嘗試學習新的東西)。 –

+0

所以,這太棒了。這是否意味着我失去了強類型視圖的優點,如果我在MVC項目中使用它?現在返回什麼類型的數據,就像之前它是一組'事件'對象一樣。 –

+1

@ChrisK,您可以創建一個包含這兩個字段的新類型(例如'UserEventBookingStatus')(可能還包含一個'UserId'字段),而不是返回一個匿名對象。 – Alex