我有以下实体:
[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)));
我想我已经到了需要更正数据库模式以重用标签的地步,这在过滤标签列表中的实体时应该提供一般性能优势,但我仍然想问以下问题:
- 我是否过于复杂化了,是否有一个简单的 Linq 语句可以完成这个,或者,
- 这是我应该使用谓词构建器来设置我的标准的东西吗?