[英]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.