我有以下实体:
[Table("Entities")]
public abstract class Entity {
public int EntityID { get; set; }
public string Description { get; set; }
public virtual ICollection<Tag> Tags { get; set; }
}
标签实体:
public class Tag {
public int TagID { get; set; }
public int EntityID { get; set; }
public string TagValue { get; set; }
}
由于以上内容使得明确的标签不重新使用,只是存储为字符串。这确定了实体共享标签是否稍微困难(和缓慢)。
我有一个工作搜索返回实体列表,其中实体包含任何标记:
List<string> searchTags = new List<String> {"test1", "test2"};
entities = (_entityRepository.Entities
.Where(o=>o.Tags.Any(f=>searchTags.Contains(f.TagValue)));
现在我还需要返回包含列表中所有标记的实体列表。由于非属性变量无法传递给Contains方法,因此我不能仅使用all来反转调用的顺序,但这基本上是我想要实现的:
entities = (_entityRepository.Entities
.Where(o=>o.Tags.All(f=>f.TagValue.Contains(searchTags)));
我认为我刚刚需要纠正数据库架构以重新使用标签,这样可以在过滤标签列表上的实体时提供一般性能优势,但我仍然想问下列问题:
答案 0 :(得分:1)
这可以这样做:
var query = _entityRepository.Entities.Select(e => e);
query = searchTags.Aggregate(query, (current, tag) => current.Where(e => e.Tags.Any(t => t.TagValue == tag)));
var result = query.ToList();