0

我有经典的 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

4 回答 4

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 扩展方法。

希望能帮助到你。

卡万

于 2009-05-18T07:36:27.817 回答
0

怎么改成

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

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

于 2009-05-18T07:33:42.937 回答
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;

不幸的是,不利的一面是这会在一定程度上损害性能。

于 2009-05-18T15:10:30.330 回答
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 的副本中删除实体的标签。之后留下的任何元素都对应于实体中缺少的标签。

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

于 2009-06-04T06:51:50.423 回答