2011-02-15 185 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等于没有。