2011-02-15 5 views
1

나는 2 개의 목록을 가지고 있으며 둘 다 비즈니스 개체입니다.Linq 쿼리 도움말

첫 번째 목적은 목록 내가 모든 메일 항목 메일을 얻기 위해 LINQ 쿼리에 필요한

List<Mail> _mailList 
List<DoNotMail> _doNotMailList 

입니다

public class Mail 
{ 
    string id; 
    string name; 
    string address; 
    .... 
} 

두 번째 목적은

public class DoNotMail 
{ 
    string id; 
    string otherinfo; 
    .... 
} 

입니다. Id는 DoNotMail.id에 없습니다.

이것이 정상적인 sql이라면 DoNotMail.id가 null 인 곳에서 왼쪽 join을 할 것이라고 생각합니다.하지만 linq에서 시도한 모든 시도는 올바르게 작동하지 않습니다.

아이디어가 있으십니까?

답변

5

간단한 방법 : 당신이 전체 Mail 항목을 원하는 원하는 가정 것

var doNotMailIds = new HashSet<string>(_doNotMailList.Select(x => x.id)); 
var mailItems = _mailList.Where(x => !doNotMailIds.Contains(x.id)); 

. 당신은 단지 자신의 ID를해야하는 경우, 한 쿼리에서 그것을 할 수 있습니다!

var mailIds = _mailList.Select(x => x.id) 
         .Except(_doNotMailList.Select(x => x.id)); 
+0

HashSet이 속도에 대한 내 대답을 능가합니다. – msarchet

+0

+1을 제외하고는 존재하지 않았다는 것을 몰랐다 – Peter

1

var mailItem = _mailList.Where(x => !_doNotMailList.Contains(x.id));

0

이 메일 (D에서 DoNotMail에서 선택 D에 m에서 =

var에 쿼리를 시도 (ID) . 당신이 두 클래스에서 Equals 메서드를 오버라이드 (override)하는 경우

1

이를 사용할 수 있습니다

_mailList.Except(_doNotMailList).ToList(); 
1

이 시도 :

var results = from m in _mailList 
       where !(from nm in _doNotMailList select nm.Id) 
       .Contains(m.Id) 
       select m; 

그것은 유엔 SQL에서하지 같다.

+0

이것은 또한 작동합니다, 감사합니다! – John