LINQ子查询问题

时间:2011-02-21 15:40:15

标签: linq

有人能告诉我如何在第一个声明中获取不在第二个声明中的记录(见下文)?

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

3 个答案:

答案 0 :(得分:2)

如果您只需要ID,那么Except应该可以解决问题:

var inFirstButNotInSecond = first.Except(second);

请注意Except将两个序列视为集合。这意味着first中的任何重复元素都不会包含在结果中。我怀疑这不会有问题,因为名称PkOrgID建议使用某种独特的ID。

(有关详情,请参阅Enumerable.ExceptQueryable.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);