2010-04-06 101 views
10

我的大脑现在似乎很糟糕!我正在使用LINQ to Entity,我需要从另一个表中不存在的表中获取一些数据。LINQ to Entity,加入NOT IN表

例如:我需要TABLE A中不存在的groupID,groupname和groupnumber,它们不会存在于TABLE B中。groupID将与其他相关信息一起存在于TABLE B中。这些表格没有任何关系。在SQL这将是非常简单的(还有一个更优雅和高效的解决方案,但我要画什么,我需要一个图片)

SELECT 
    GroupID, 
    GroupName, 
    GroupNumber, 
FROM 
    TableA 
WHERE 
    GroupID NOT IN (SELECT GroupID FROM TableB) 

有一个简单/优雅的方式来做到这一点使用实体框架/ LINQ到实体? 现在我有一堆查询命中数据库,然后比较等。这很麻烦。

回答

14

你可以使用任何

var temp =context.TableA 
     .Where(x=>!context.TableB.Any(y=>y.GroupID!=x.GroupID)) 
     .Select(x=>new { GroupID = x.GroupID, GroupName=x.GroupName, GroupNumber = x.GroupNumber}).ToList(); 
+0

如果内部子句是'y => y.GroupID == x.GroupID'? (如果'GroupB'中有'TableB'中的任何项目,则返回false) – Hannele 2013-10-03 18:43:30

+0

@Hannele技术上它是相同的,可能更具可读性。出于某种原因,我被构建为向后执行布尔逻辑。 – Nix 2013-10-04 12:07:48

+0

我同意Hannele,我认为它应该是Where(x =>!context.TableB.Any(y => y.GroupID == x.GroupID)) – Sam 2016-03-03 08:12:41

4

这取决于你是怎么认识他们,你不显示,但一般:

var q = from a in Context.TableA 
     where !a.Group.TableBs.Any() 
     select new 
     { 
      GroupID = a.GroupID, 
      GroupName = a.GroupName, 
      GroupNumber = a.GroupNumber 
     }; 
1

@Nix - 您的结果集应或者被:

var temp =context.TableA 
     .Where(x=>context.TableB.Any(y=>y.GroupID != x.GroupID)) 
     .Select(x=>new { GroupID = x.GroupID, GroupName=x.GroupName, GroupNumber = x.GroupNumber}).ToList(); 

或者

var temp =context.TableA 
     .Where(x=> ! context.TableB.Any(y=>y.GroupID == x.GroupID)) 
     .Select(x=>new { GroupID = x.GroupID, GroupName=x.GroupName, GroupNumber = x.GroupNumber}).ToList(); 

但不是两个,就像你写的那样。