簡體   English   中英

Linq到具有多級子引用的實體查詢

[英]Linq to entities query having multi level child references

我在設計查詢以檢索候選人已經嘗試過的問題以及另一個針對候選人尚未嘗試過的問題的查詢時遇到了太多麻煩。 這是用於檢查/測試/表格/調查類型的應用程序。

架構圖

該方案是候選項(OAS_UserDetail)與許多組(OAS_Group)相關聯。 一組可以進行許多測試。 測試可能有很多問題。 一個問題可以有很多選擇。

當候選人嘗試提問時,該問題將存儲在表TestResponse中並引用了會話(表TestResponse中的answerSelected實際上是QuestionOption.Id)。 我相信TestSession可以充當TestResponse的橋梁,以獲取用戶,測試和組的詳細信息。

就我而言,對於通過Linq進行查詢而言,這對我來說是一個不錯的設計,但有些復雜。 下面是我試圖做的,被卡住了,最終用方法語法而不是查詢語法編寫了Linq。

OAS.DataModels.OAS_Question questionsAttempted = 
            from q in db.OAS_Questions
            where q.OAS_Test.OAS_Group.Candidates.Contains(
                      db.OAS_UserDetails.Single(u => u.UserName == HttpContext.User.Identity.Name)
            )                         
            select q;

Linq查詢語法與SQL非常相似。 您應該能夠使用“ join”運算符執行所需的操作。

這是一個很好的概述:

http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

因此,您正在尋找候選人的TestResponse記錄中選項是否存在的TestResponse 我認為這可能有效:

(from u in OAS_UserDetail
from g in u.OAS_Group
from t in g.OAS_Test
from q in t.OAS_Question
from o in q.OAS_QuestionOption
where u.Id == userId // a variable
where u.OAS_TestSession
      .SelectMany(s => s.OAS_TestResponse)
      .Select(r => r.AnswerSelectedId).Contains(o.Id)
select q).Distinct()

對於候選人未嘗試的問題: where !u.OAS_TestSession...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM