c# - 在 c#.net 中为连接后的连接构建正确的 Linq 查询语法时遇到问题
问题描述
我无法为我拥有的应用程序列表创建正确的查询。我需要将它们显示在仪表板中,以便顾问可以处理应用程序。这些应用程序可以由组织或个人上传。
每个顾问都是少数组织和个人的“所有者”,在仪表板中,他们应该只看到他们也是“所有者”的个人/组织的申请。
应用表:
Application
-----------
ID | requestIndividualID | requestOrganisationID | ...
根据谁提出申请,请求者 ID 将保存在表中。所以requestIndividualID
或requestOrganisationID
,其中一个将是null
,另一个不是。
个人表:
Individual
----------
ID | name | ownerID
现在是棘手的部分,ownerID
它不在 Organization 表上,而是在 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 个结果,一个用于所有具有 a 的应用程序,requestIndividualID
一个用于所有具有requestOrganisationID
.
然后我将过滤器(特定的ownerID
)应用于这两个单独的结果,并将结果添加到列表中,因为结果来自同一个表,这真的很容易。但是imo这是一种快速而肮脏的处理方式。我想要正确而干净的答案。
有人能帮帮我吗?我也很难在互联网上找到任何帮助,所以如果你找到了一些信息,也请链接它,或者告诉我如何提高我的谷歌技能来解决这样的问题(问题的正确命名)。
解决方案
我相信如果你先加入Orginisation
andOrginisationSegment
表,这会更容易,假设每个Orginisation
都有ownerID
in 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 };
推荐阅读
- python - 使用 max(iterable) 时是否可以获得平局通知?
- visual-studio-code - 使用 VS Code 任务向现有 json 添加属性
- javascript - React-Router重新加载当前页面然后移动到新链接
- react-native - 通过导航更新前一个屏幕中的数据
- spring-boot - Spring Boot 千分尺常用标签
- r - *** 捕获 segfault *** 地址 0x38,使用 googlesheets4::gs4_auth 时导致“内存未映射”
- python - 烧瓶全局变量
- git - Git分支--合并的分支没有出现
- java - 运行 OneSignal 的最低规格是什么?
- r - 如何解决 R 中的此错误:water.exceptions.H2OConcurrentModificationException:无法汇总,因为 Vec 已被删除?