Linqtosql - 查找与查询中的所有标记匹配的所有实体

时间:2009-05-18 07:23:52

标签: linq-to-sql distinct tagging

我有经典的3表 - 实体,标签和实体标签 - 数据库结构。

为了找到用某些标签标记的所有实体,我使用以下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',则尽管不匹配这两个标记,它仍会在结果中返回。

我无法弄清楚如何从结果中排除这些实体?

或者我应该采取完全不同的方法吗?

4 个答案:

答案 0 :(得分:1)

请尝试此查询:

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

All扩展方法将确保每个标记符合包含标准。

对于只需要满足一个条件的情况,还有一种Any扩展方法。

希望它有所帮助。

卡万

答案 1 :(得分:0)

如何将其更改为

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

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

答案 2 :(得分:0)

根据Eoin的建议,需要使用Distinct(),但它不适用于整个实体标签集。使用另一个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;

不幸的是,缺点是这会对性能造成一定影响。

答案 3 :(得分: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的副本中删除实体的标签。之后留下的任何元素都对应于实体中缺少的标记。

但我不知道这是如何表现的。