首页 > 解决方案 > 在 c#.net 中为连接后的连接构建正确的 Linq 查询语法时遇到问题

问题描述

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

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

应用表:

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

根据谁提出申请,请求者 ID 将保存在表中。所以requestIndividualIDrequestOrganisationID,其中一个将是null,另一个不是。

个人表:

Individual
----------
ID  |  name  |  ownerID 

现在是棘手的部分,ownerID它不在 Organization 表上,而是在 OrganisationSegment 表上,如下所示:

Organisation
------------
ID  |  name  |  city
OrganisationSegment
-------------------
organisationID  |  ownerID

当我想将 Organization 表与 OrganisationsSegment 表连接时,问题就来了,因为它可能organisationIDnull.

目前我有这个抛出错误的代码:

 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 个结果,一个用于所有具有 a 的应用程序,requestIndividualID一个用于所有具有requestOrganisationID.

然后我将过滤器(特定的ownerID)应用于这两个单独的结果,并将结果添加到列表中,因为结果来自同一个表,这真的很容易。但是imo这是一种快速而肮脏的处理方式。我想要正确而干净的答案。

有人能帮帮我吗?我也很难在互联网上找到任何帮助,所以如果你找到了一些信息,也请链接它,或者告诉我如何提高我的谷歌技能来解决这样的问题(问题的正确命名)。

标签: c#sqllinq.net-core

解决方案


我相信如果你先加入OrginisationandOrginisationSegment表,这会更容易,假设每个Orginisation都有ownerIDin 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 };

推荐阅读