簡體   English   中英

C# 實體框架 OrderBy Children's Children's with a where 子句

[英]C# Entity Framework OrderBy Children's Children's with a where clause

我有一個非常復雜的 linq 語句,它獲取人員列表(使用實體框架),我想在末尾添加一個OrderBy子句,具體取決於用戶單擊哪個列進行排序。 我不想讓所有人都進行排序,因為可能有很多人,而且我們也進行分頁,所以獲取數據然后排序/分頁不是一種選擇。 因此必須使用 LINQ 到 EF 來完成。

我已經設法獲得根據用戶當前疫苗接種狀態進行過濾的搜索條件,但我無法將其“轉換”為OrderBy語句

我獲得的數據與 COVID 疫苗接種有關,以及該人的疫苗接種狀態是完全、部分、未披露還是無。

帶有Where子句的實體框架 LINQ 語句如下所示,它是IQueryable<Person> ,而不是List<Person>

people.Where(p => p.Encounters.Where(e =>
          e.EncounterItems.Any(ei => ei.PersonAssessments.Any(pa =>
          pa.Assessment.Questions.Any(q => q.questioncode.Equals("qIDateF", StringComparison.InvariantCultureIgnoreCase) || q.questioncode.Equals("qIDateP", StringComparison.InvariantCultureIgnoreCase)))))
          .OrderByDescending(e => e.servicedt ?? e.planneddt).FirstOrDefault()
          .EncounterItems.Where(ei =>
          ei.PersonAssessments.Any(pa => pa.Answers.Any(a => a.adate.HasValue && DbFunctions.AddMonths(a.adate, procedureCycleDays) < DateTime.Today &&
          (a.Question.questioncode.Equals("qIDateF", StringComparison.InvariantCultureIgnoreCase) || (a.Question.questioncode.Equals("qIDateP", StringComparison.InvariantCultureIgnoreCase)
          && (!pa.Answers.Any(aa => aa.adate.HasValue && aa.Question.questioncode.Equals("qIDateF", StringComparison.InvariantCultureIgnoreCase)))
          ))))).FirstOrDefault()
          != null)

從上面它將過濾他們的疫苗接種狀態為“過期”的人。 即他們已經進行了部分或全部疫苗接種,但已超過此疫苗接種的周期。 問題代碼的“qIDateP”(部分)和“qIDateF”(完整)有 2 個問題。

我知道下面的OrderBy是完全錯誤的,但我想做這樣的事情,以便所有疫苗接種過期的人都排在首位。 然后,我將使用相同的子句添加其他幾個OrderBy子句,例如“Current”,只是鏈接日期表達式,例如DbFunctions.AddMonths(a.adate, procedureCycleDays) >= DateTime.Today

people.OrderBy(p => p.Encounters.Where(e =>
       e.EncounterItems.Any(ei => ei.PersonAssessments.Any(pa =>
       pa.Assessment.Questions.Any(q => q.questioncode.Equals("qIDateF", StringComparison.InvariantCultureIgnoreCase) || q.questioncode.Equals("qIDateP", StringComparison.InvariantCultureIgnoreCase)))))
       .OrderByDescending(e => e.servicedt ?? e.planneddt).FirstOrDefault()
       .EncounterItems.Where(ei =>
       ei.PersonAssessments.Any(pa => pa.Answers.Any(a => a.adate.HasValue && DbFunctions.AddMonths(a.adate, procedureCycleDays) < DateTime.Today &&
       (a.Question.questioncode.Equals("qIDateF", StringComparison.InvariantCultureIgnoreCase) || (a.Question.questioncode.Equals("qIDateP", StringComparison.InvariantCultureIgnoreCase)
       && (!pa.Answers.Any(aa => aa.adate.HasValue && aa.Question.questioncode.Equals("qIDateF", StringComparison.InvariantCultureIgnoreCase)))
       ))))).FirstOrDefault()
       != null)

EF 模型的關系如下:

Person => Encounter => EncounterItem => PersonAssessment => Answer

一個人可以在一生中回答多項評估,並且可以改變他們是否要披露其疫苗接種狀態的想法。

注意:我們使用的是最新的 Entity Framework 6.4.4

我希望有人可以幫助我解決 OrderBy 條款,因為我完全不知道如何實現這一點。

好吧,據我所知,您想使用 orderBy 然后簡單地獲取第一個元素,而您可以使用相同的謂詞簡單地獲取第一個元素,從而降低 O(nlogn) 復雜度

var result = people.Where(
    p => p.Encounters.Where(
        e => e.EncounterItems.Any(
            ei => ei.PersonAssessments.Any(
                pa => pa.Assessment.Questions.Any(
                    q => q.questioncode.Equals("qIDateF", StringComparison.InvariantCultureIgnoreCase) 
                      || q.questioncode.Equals("qIDateP", StringComparison.InvariantCultureIgnoreCase)))))
      .FirstOrDefault(e => e.servicedt ?? e.planneddt) // you have 1 Encounters item
      .EncounterItems.FirstOrDefault(
        ei => ei.PersonAssessments.Any(
            pa => pa.Answers.Any(
                a => a.adate.HasValue 
                    && DbFunctions.AddMonths(a.adate, procedureCycleDays) < DateTime.Today 
                      && (a.Question.questioncode.Equals("qIDateF", StringComparison.InvariantCultureIgnoreCase) 
                        || (a.Question.questioncode.Equals("qIDateP", StringComparison.InvariantCultureIgnoreCase)
                          && (!pa.Answers.Any(aa => aa.adate.HasValue && aa.Question.questioncode.Equals("qIDateF", StringComparison.InvariantCultureIgnoreCase)))))))));

暫無
暫無

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

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