在连接后

时间:2019-05-29 14:13:16

标签: c# sql linq .net-core

我无法为我拥有的应用程序列表创建正确的查询。我需要在仪表板上显示它们,以便顾问可以处理应用程序。 这些应用程序可以由组织或个人上载。

每个顾问都是一些组织和个人的“所有者”,在仪表板中,他们应该只能看到自己也是“所有者”的个人/组织的申请。

应用程序表:

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

取决于创建应用程序的人,请求者ID将保存在表中。因此requestIndividualIDrequestOrganisationID,其中一个将是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技能(正确命名问题)。

1 个答案:

答案 0 :(得分:0)

我认为,如果您首先连接OrginisationOrginisationSegment表,并且假设每个OrginisationownerID中都有一个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 };