簡體   English   中英

無法在c#.net中為連接后的連接構造正確的Linq查詢語法

[英]Having trouble constructing the correct Linq query syntax in c#.net for a join after join

我有麻煩為我的應用程序列表創建正確的查詢。 我需要在儀表板中顯示它們,以便顧問可以處理應用程序。 這些應用程序可以由組織或個人上傳。

每個顧問都是少數組織和個人的“所有者”,在儀表板中,他們應該只看到來自個人/組織的申請,他們也是“所有者”。

應用程序表:

Application
-----------
ID  |  requestIndividualID   |  requestOrganisationID | ...

取決於誰創建了應用程序,請求者ID將保存在表中。 所以requestIndividualIDrequestOrganisationID ,其中一個將為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 )應用於這兩個單獨的結果,並將結果添加到列表中,因為結果來自同一個表,這非常簡單。 但是,這是一種快速而骯臟的處理方式。 我想要正確而干凈的答案。

有人能幫幫我嗎? 此外,我很難在互聯網上找到任何幫助,所以如果你發現了一些信息,請鏈接它,或告訴我如何提高我的谷歌技能這樣的問題(正確的問題命名)。

我相信,如果你加入了,這是比較容易OrginisationOrginisationSegment第一表,假設每個OrginisationownerIDOrginisationSegment

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.

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