2013-03-15 45 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)