2009-05-18 86 views
0

我有经典的3表 - 实体,标签和entitytag - 数据库结构。Linqtosql - 查找与查询中所有标签匹配的所有实体

为了找到标有我使用下面的Linqtosql某些代码标签的所有实体:

string[] myTags = {"tag1","tag2"}; 

var query = from m in entity 
      where m.entitytag.Where(c => myTags.Contains(c.tag.TagName)).Count() == myTags.Count() 
      select m; 

然而,当实体有重复的标签(有这个正当的理由在我真正的应用程序)的查询返回不匹配所有标签的实体。

例如,在上面的代码示例中,如果一个实体被标记了两次'tag1'而不是'tag2',它将返回结果,尽管不匹配两个标记。

我不知道如何从结果中排除这些实体?

还是有一个完全不同的方法,我应该采取?

回答

0

正如约恩建议,鲜明的()需要被使用,但它并没有对整个entitytag台工作。这里使用另一个Select语句来比较实际的标签。

string[] myTags = {"tag1","tag2"}; 

    var query = from m in entity 
    where m.entitytag.Select(et => et.tag.TagName).Distinct().Where(c => myTags.Contains(c)).Count() == myTags.Count() 
    select m; 

不幸的是,这样做的缺点是这会使性能受到一些损害。

0

如何将其更改为

where m.entitytag.Distinct().Where(c => ... 

从实体对象的子集,将删除重复entitytags,并让您的计数正常工作

+0

我已经尝试过,但它仍然返回重复的条目。 – 2009-05-18 07:56:10

+0

在Distinct完成此项工作之前添加Select(et => et.tag.TagName)。看到我对这个问题的回答... – 2009-05-18 15:12:12

1

试试这个查询,而不是:

    string[] myTags = { "tag1", "tag2" }; 
        var query = from m in entity 
           where myTags.All(tag => m.entitytag.Contains(tag)) 
           select m; 
        query.Dump(); 

所有扩展方法都是确保每个标签都符合包含条件。

对于只需满足一个条件的情况,也有任何扩展方法。

希望它有帮助。

卡万

+0

这是无效的。 where子句中的'tag'是string类型而不是entitytag。 – 2009-05-18 08:07:27

0

尝试

string[] myTags = { "tag1", "tag2" }; 

var query = from e in entity 
      where !myTags.Except(from e.tag select e.tag.TagName).Any() 
      select e; 

的想法是从myTags的副本中删除实体的标签。之后留下的任何元素都与实体中缺少的标签相对应。

我不知道这是如何执行,但。

相关问题