我无法为我拥有的应用程序列表创建正确的查询。我需要在仪表板上显示它们,以便顾问可以处理应用程序。 这些应用程序可以由组织或个人上载。
每个顾问都是一些组织和个人的“所有者”,在仪表板中,他们应该只能看到自己也是“所有者”的个人/组织的申请。
应用程序表:
Application
-----------
ID | requestIndividualID | requestOrganisationID | ...
取决于创建应用程序的人,请求者ID将保存在表中。因此requestIndividualID
或requestOrganisationID
,其中一个将是null
,另一个不是。
个人表:
Individual
----------
ID | name | ownerID
现在出现了棘手的部分,ownerID
不在“组织”表上,而是在OrganisationSegment表上,如下所示:
Organisation
------------
ID | name | city
OrganisationSegment
-------------------
organisationID | ownerID
当我想将Organization表与OrganisationsSegment表结合在一起时,就会出现问题,因为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
)应用于这2个单独的结果,并将结果添加到列表中,因为结果来自同一张表,因此非常简单。
但是,imo这是一种快速而肮脏的处理方式。
我想要正确和干净的答案。
有人可以帮我吗? 另外,我在互联网上也找不到任何帮助,因此,如果您找到了一些信息,请也将其链接起来,或者告诉我如何改善此类问题的Google技能(正确命名问题)。
答案 0 :(得分:0)
我认为,如果您首先连接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 };