2011-02-15 130 views
1

我有2個列表,都是業務對象。Linq查詢幫助

第一個對象是

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

第二個目的是

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

的名單

List<Mail> _mailList 
List<DoNotMail> _doNotMailList 

我需要一個LINQ查詢來獲取所有郵件項目在此郵件。 Id不在DoNotMail.id

如果這是正常的SQL,我想我會做一個左連接,其中DoNotMail.id爲空,但是我試圖在linq中做的每一次嘗試都無法正常工作。

任何想法?

回答

5

最簡單的方法:

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

這是假設你要要充分Mail項目。如果你只需要它們的ID,你可以做一個查詢:

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

HashSet擊敗我的答案出來的速度。 – msarchet 2011-02-15 15:10:06

+0

+1除了,不知道它存在 – Peter 2011-02-15 16:03:09

1

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

0

在郵件 其中(從d在DoNotMail 選擇d試試

VAR的查詢=從m個.Id) .Contains(m.Id) select m;

1

如果覆蓋Equals方法在兩個類你可以使用這個:

_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等於沒有。