我有经典的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',则尽管不匹配这两个标记,它仍会在结果中返回。
我无法弄清楚如何从结果中排除这些实体?
或者我应该采取完全不同的方法吗?
答案 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的副本中删除实体的标签。之后留下的任何元素都对应于实体中缺少的标记。
但我不知道这是如何表现的。