2011-09-02 76 views
2

想象中的照片标签系统...LINQ查询使用ALL

public class Photo 
    { 
     public IList<Tag> Tags {get;set;} 
    } 

    public class Tag 
    { 
     public string Name {get;set;} 
    } 

IList<Tag> tags = new [] { 
          new Tag{Name = "tag1"}, 
          new Tag{Name = "tag2"} 
         }; 

IList<Photo> photos = GetAllPhotos(); 

这行:

var results = //return photos when Photo.Tags contains BOTH tags 

是否有一个LINQ操作我可以用它来实现这一目标?

回答

11

肯定的:

// All the tags in "tags" are contained in p.Tags 
var results = photos.Where(p => tags.All(tag => p.Tags.Contains(tag))); 

// All the "tags" except the ones in p.Tags ends up as an empty set 
var results = photos.Where(p => !tags.Except(p.Tags).Any()); 

编辑:请注意,这个假设在现实中你已经有了标签适当平等的实现。否则,你需要这样的东西:

var results = photos.Where(p => !tags.Select(t => t.Name) 
            .Except(p.Tags.Select(t => t.Name)).Any()); 
+0

哈哈,你太快了! –

+1

他可能想要标签名称上的匹配,尽管...不会做包含对象的比较吗? – jvenema

+1

@jvenema:编辑。这可能会更好地使Tag实现'IEquatable ' –

0
photos.Where(p => t.Tags.Contain(tags[0]) && t.Tags.Contains(tag[1])); 

它很难知道运营商Tag有什么。

+1

将不匹配的标签名称(这将是一个byref操作),我假设他需要它是灵活的扩大到> 2标签。 – jvenema

+0

'tag [0]'应该是'tags [1]'? –

+0

你是对的@Jvenema。 – mxmissile