2013-06-19 32 views
0

我需要在一個表上執行左外部連接,其中有多個條件。我在我的選擇上選擇「'Expected Contextual keyword''上的錯誤消息。」在我的下面的代碼中,我的第一個地方是爲那個特定的表CourseDbset我需要做一個左外連接。我的第二個地方應用於我的結果數據,以根據狀態值過濾數據。我道歉如果我不清楚。預期的上下文關鍵字'on'

var StudentsInfo =(from user in context.aspnet_Users 
            join lc in context.class on      
             user.userId equals lc.userId 
            join course in context.CourseDbSet 
            .Where(o => o.courseId == sessionId && o.enrollId = sessionid 
            && o.deptID == sessionoddeptid).DefaultIfEmpty() 

            select new 
            { 
            userid = user.UserId, 
            username = user.UserName, 
            status = course.status 

            }).Where(o => o.status == 0 || o.status == 3 || o.status == 4 || o.status is DBNull).ToList(); 
+1

你有第二次加入沒有標準。 – Phill

+0

你有正確的想法,但左連接需要不同的語法。請參閱[從MSDN發佈此帖](http://msdn.microsoft.com/en-us/library/vstudio/bb397895.aspx)和[此SO問題](http://stackoverflow.com/questions/1092562/ left-join-in-linq)來獲得更好的想法。 – valverij

回答

2

你的第一個連接(這是正確的):

join lc in context.class 
    on user.userId equals lc.userId 

並且那你的第二個連接(這是錯誤的):

join course in context.CourseDbSet 
         .Where(o => o.courseId == sessionId && 
            o.enrollId = sessionid && 
            o.deptID == sessionoddeptid).DefaultIfEmpty() 

// missing on statement 
[on user.SOMETHING equals course.SOMETHING] 

//編輯

窗口。我錯過了.DefaultIfEmpty()電話。如果你想執行一個左連接,那麼你需要一個類似的東西:

join course in context.CourseDbSet 
         .Where(o => o.courseId == sessionId && 
           o.enrollId = sessionid && 
           o.deptID == sessionoddeptid) 

// missing on statement && left join 
    on user.SOMETHING equals course.SOMETHING 
into courseJoinData 
from courseJoinRecord in courseJoinData.DefaultIfEmpty() 
+0

在我的where子句最後我有問題與o.status == null.it給我錯誤「轉換爲值類型'Int16'失敗,因爲物化值爲null。結果類型的泛型參數或查詢必須使用可空類型「。即使狀態字段爲空,我也需要獲取行 –

+0

@BVidhya即使'o'爲空,您也會得到行,但是當'o'爲空時檢查將失敗,您將進一步檢查o.status == 1'。試試'.Where(o => o == null || o.status == 1 [...])'。空檢查需要首先進行,否則無法檢查狀態。 – Viper

相關問題