有人能告诉我如何在第一个声明中获取不在第二个声明中的记录(见下文)?
from or in TblOrganisations
where or.OrgType == 2
select or.PkOrgID
第二次查询:
from o in TblOrganisations
join m in LuMetricSites
on o.PkOrgID equals m.FkSiteID
orderby m.SiteOrder
select o.PkOrgID
答案 0 :(得分:2)
如果您只需要ID,那么Except
应该可以解决问题:
var inFirstButNotInSecond = first.Except(second);
请注意Except
将两个序列视为集合。这意味着first
中的任何重复元素都不会包含在结果中。我怀疑这不会有问题,因为名称PkOrgID
建议使用某种独特的ID。
(有关详情,请参阅Enumerable.Except
和Queryable.Except
的文档。)
答案 1 :(得分:1)
您需要整个记录,还是只需要ID?身份证很容易......
var ids = firstQuery.Except(secondQuery);
编辑:好的,如果你不能这样做,你需要像:
var secondQuery = ...; // As you've already got it
var query = from or in TblOrganisations
where or.OrgType == 2
where !secondQuery.Contains(or.PkOrgID)
select ...;
检查它产生的SQL,但我认为它应该做正确的事情。请注意,在第二个查询中执行任何排序都没有意义 - 甚至是针对TblOrganisations的连接。换句话说,您可以使用:
var query = from or in TblOrganisations
where or.OrgType == 2
where !LuMetricSites.Select(m => m.FkSiteID).Contains(or.PkOrgID)
select ...;
答案 2 :(得分:0)
使用Except
:
var filtered = first.Except(second);