4

我正在使用实体框架
所以我想使用两个表 - tblContractor 和 tbSiteByCont 表编写一个 sql 命令。在 SQL 中看起来像这样

SELECT     PKConID, Fname, Lname
FROM         tblContractor
WHERE     (PKConID NOT IN
                          (SELECT     FKConID
                            FROM          tbSiteByCont
                            WHERE      (FKSiteID = 13)))

但我不知道如何用 Linq 编写。

我试过这样

  var query1 = from s in db.tblSiteByConts   
                        where  s.FKSiteID == id
                        select s.FKConID;


            var query = from c in db.tblContractors   
                        where c.PKConID != query1.Any()
                        select Contractor;

但这不起作用。那我该怎么写呢?程序是什么?我是Linq的新手。

4

3 回答 3

19
var _result = from a in tblContractor
              where !(from b in tbSiteByCont
                        where FKSiteID  == 13
                        select b.FKConID)
                        .Contains(a.PKConID)
              select a;

或者

var siteLst = tbSiteByCont.Where(y => y.FKSiteID == 13)
                          .Select(x => x.FKConID);
var _result = tblContractor.Where(x => !siteLst.Contains(x.PKConID));
于 2013-03-15T04:34:21.050 回答
4

我会使用 HashSet,它可以确保您只评估一次序列。

var result = from p in tblContractor
                      let hasht = new HashSet<int>((from b in tbSiteByCont
                                                    where b.FKSiteID == 13
                                                    select b.PKConID).Distinct())
                      where !hasht.Contains(p.PKConID)
                      select p;
于 2013-12-19T01:04:43.200 回答
0

这也可以吗

var _result = from a in tblContractor
                       .Where(c => tbSiteByCont
                       .Count(sbc => sbc.FKSiteID == 13 && c.PKConID == sbc.FKConID) == 0) 
于 2016-04-07T14:58:24.143 回答