2010-04-06 4 views
10

내 뇌가 이제 자꾸 자꾸 보인다! 엔티티에 LINQ를 사용하고 있는데 다른 테이블에 존재하지 않는 테이블에서 데이터를 가져와야합니다.LINQ to Entity, NOT IN 테이블에 가입

예 : groupID, groupname 및 groupnumber는 표 A에 없으며 표 B에 없습니다. groupID는 표 B에 기타 관련 정보와 함께 존재합니다. 테이블에는 관계가 없습니다. SQL에서 그것은 엔티티 프레임 워크를 사용하여이 작업을 수행 할 수있는 쉬운/우아한 방법이 있나요 (가 더 우아하고 효율적인 솔루션입니다,하지만 난 필요의 그림을 그릴 싶어)

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

매우 간단하게 될 것이다/LINQ to Entity? 지금 당장 DB를 치고 여러 번 비교하는 쿼리가 있습니다. 꽤 지저분합니다.

답변

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'입니까? ('GroupID'를 가지고'TableB'에 항목이 있으면 false를 반환합니다.) – Hannele

+0

@Hannele 기술적으로는 같고 아마도 더 읽기 쉽습니다. 어떤 이유로 나는 불리언 논리를 거꾸로하기 위해 만들어졌습니다. – Nix

+0

나는 Hannele과 동의한다, 나는 그것이 어디에 있어야만한다고 생각한다. (x =>! context.TableB.Any (y => y.GroupID == x.GroupID)) – Sam

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(); 

하지만 둘 다 쓰지 마세요.