2015-04-27 63 views
0

我有一個複雜的查詢與EF執行使用LINQ。我知道這樣做手工與多個循環的方式,但我想與LINQ查詢做到這一點:LINQ-EF查詢分組多個表

場景:測試中心,爲學生

數據庫涉及到我的情況5個基本表:測試,提問,回答,結果和參與者。

測試包含測試本身。 (int testId,string testName)。 1-N與問題的關係。

問題包含測試問題。 (int questionID,int testId,string questionText)

答案包含問題的每個可能的答案:(int answerId,int questionId,bool isCorrect)與問題的1-N關係。

結果包含回答這個問題每每一個答案,一個記錄,有關學生:(INT ResultId,詮釋AnswerId,INT participantId,布爾isSelectedByParticipant)1:1個的答案關係。

參加者:(int participantId)。與結果1:1的關係。

我想知道一個學生在每次考試中成功回答了多少個答案(因此學生可以做一些課程考試)。一個問題可以有一個或多個答案正確,但總是至少有一個答案是正確的,所以如果與問題相關的每個答案都沒有被學生標記(isSelectedByParticipant = false),那麼該問題的結果是錯誤的。

enter image description here

非常感謝大家的幫助烏拉圭回合。

+0

不確定結果的實體IsSelectedByParticipant attribure,因爲據我瞭解,進入結果將是一個學生(ParticipantId) – Vasan

+0

有任何記錄你是對的,但默認情況下,結果表中充滿了參加考試的每個學生(在他出席之前),用IsSelectedByParticipant將每個結果標記爲「假」,因此默認情況下,學生會失敗一切,除非他爲每個問題標記一個答案這是我沒有定義的業務規則)。 – Carlos

+0

我知道這不是問題,但我不確定你是否試圖存儲太多信息。我認爲結果應該是參與者針對某個問題的每個回答(選定答案)。在這種情況下,您不需要標記「IsSelectedByParticipant」就好像它沒有存儲一樣,它沒有被選中?試圖抓住這裏。 – army

回答

1

類似的東西來:

results.GroupBy(r => r.ParticipientId).Select(p => new 
       { 
        StudentId = p.Key, 
        Count = p.GroupBy(pr => pr.Answer.QuestionId).Select(cc => new { 
// any correct answer is not selected or any incorrect answer is selected 
         notCorrect = cc.Any(q => !q.IsSelected && q.Answer.IsAnswerCorrect) || cc.Any(q => q.IsSelected && !q.Answer.IsAnswerCorrect) 
        }).Count(res => !res.notCorrect) 
       }); 

這裏工作example

+0

**。計數(res =>!res.notCorrect)**計數正確的答案,因爲**!**,所以結果是確定的;) –

+0

它的作品! Marcin J你是我的英雄。 – Carlos

+0

Hello again Marcin J,我發現了一些新的東西添加到我的查詢中,測試名稱。我一直在尋找另一個組來檢索測試名稱,但我無法找到一個合適的解決方案,以防學生參加多個測試。 Thx再次4你的幫助 – Carlos