2013-03-15 42 views
4

我正在使用實體框架
所以我想寫一個sql命令使用兩個表 - tblContractor和tbSiteByCont表。 它看起來像這樣在SQL如何使用Linq「NOT IN」

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的新手。

+1

這是LINQ,而不是MVC。 – 2013-03-15 04:41:35

回答

18
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)); 
+0

有錯誤說-System.Linq.IQueryable '不包含'Contains'的定義和最佳擴展方法重載'System.Linq.ParallelEnumerable.Contains (System.Linq.ParallelQuery ,TSource )'有一些無效的參數 – user1348351 2013-03-15 04:47:53

+0

看到我更新的答案。 – 2013-03-15 04:50:15

+1

謝謝。這是workink – user1348351 2013-03-15 05:01:18

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; 
0

可能這個工程太

var _result = from a in tblContractor 
         .Where(c => tbSiteByCont 
         .Count(sbc => sbc.FKSiteID == 13 && c.PKConID == sbc.FKConID) == 0)