[英]Having trouble constructing the correct Linq query syntax in c#.net for a join after join
我有麻煩為我的應用程序列表創建正確的查詢。 我需要在儀表板中顯示它們,以便顧問可以處理應用程序。 這些應用程序可以由組織或個人上傳。
每個顧問都是少數組織和個人的“所有者”,在儀表板中,他們應該只看到來自個人/組織的申請,他們也是“所有者”。
應用程序表:
Application
-----------
ID | requestIndividualID | requestOrganisationID | ...
取決於誰創建了應用程序,請求者ID將保存在表中。 所以requestIndividualID
或requestOrganisationID
,其中一個將為null
,另一個不是。
個人表:
Individual
----------
ID | name | ownerID
現在是棘手的部分, ownerID
不在Organization表上,而是在OrganisationSegment表上,如下所示:
Organisation
------------
ID | name | city
OrganisationSegment
-------------------
organisationID | ownerID
當我想使用OrganisationsSegment表加入Organization表時會出現問題,因為organisationID
可能為null
。
目前我有這個代碼拋出錯誤:
var applications = from pa in _context.Applications
join individu in _context.Individu on pa.requestIndividualID equals individu.ID into IndividuResultList
from individu in IndividuResultList.DefaultIfEmpty()
join organisation in _context.Organisations on pa.requestOrganisationID equals organisation.ID into organisationsList
from organisation in organisationsList
join organisationSegment in _context.OrganisationSegment on organisation.ID equals organisationSegment.OrganisationId into organisationSegmentList
from organisationSegment in organisationSegmentList.DefaultIfEmpty()
select new {Data = new {PortalApplications = pa, individu, organisation, organisationSegment}};
在此代碼之后,我使用結果制作一個列表,我可以在其中為所有者ID應用過濾器。
當我執行此代碼時,它會拋出System.InvalidOperationException : Nullable object must have a value.
錯誤。
我目前的解決方案是制作2個結果,一個用於具有requestIndividualID
所有應用程序,一個用於具有requestOrganisationID
所有應用程序。
然后我將過濾器(特定的ownerID
)應用於這兩個單獨的結果,並將結果添加到列表中,因為結果來自同一個表,這非常簡單。 但是,這是一種快速而骯臟的處理方式。 我想要正確而干凈的答案。
有人能幫幫我嗎? 此外,我很難在互聯網上找到任何幫助,所以如果你發現了一些信息,請鏈接它,或告訴我如何提高我的谷歌技能這樣的問題(正確的問題命名)。
我相信,如果你加入了,這是比較容易Orginisation
和OrginisationSegment
第一表,假設每個Orginisation
有ownerID
在OrginisationSegment
。
var OrganisationsWithOwner = from o in _context.Organisations
join os in _context.OrganisationSegment on o.ID equals os.OrganisationId
join i in _context.Individu on os.OwnerID equals i.ID
select new { o, i };
現在您可以加入Individu
和新的OrginisationWithOwner
並返回一個匹配的。
var applications = from pa in _context.Applications
join indOwner in _context.Individu on pa.requestIndividualID equals indOwner.ID into IndividuResultList
from indOwner in IndividuResultList.DefaultIfEmpty()
join o in OrganisationsWithOwner on pa.requestOrganisationID equals o.o.ID into organisationsList
from o in organisationsList.DefaultIfEmpty()
select new { PortalApplications = pa, owner = (indOwner != null ? indOwner : o.i), organisation = o.o };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.