我有一个名为文章的表:
-Id
-Title
-Content
-Tags (This is a comma seperated list of tags e.g. 'Sports,Italy,Ferrari')
我希望能够使用 Entity Framework 找到所有具有特定标签的文章。
List<Article> GetArticles(List<String> tags)
{
//do an entity framework query here to find all articles which have the tags specified
}
返回的条目应包含所有指定的标签。 例如如果函数的输入是 'car','blue',则应返回至少包含这 2 个标签的所有条目。
我无法开始想象如何实现它。我知道如何使用存储过程实现此目的,这是我的计划 b。
最佳答案
存储过程实际上是一个不错的选择,如果不是最好的选择,真的。但是,您仍然可以使用 Contains
实现它:
var articles = db.Articles.Where(m => tags.Any(t => m.Tags.Contains(t)));
这基本上是遍历传入的标签并创建一个查询来测试 Tags
是否与其中任何一个相似。请记住,因为这将是一个 LIKE 查询,所以它将是 sloooooowwwww,除非您的 Tags
列被索引,这也要求它是一个定义的长度,而不是像 NVARCHAR(最大)。
另一个潜在问题是错误匹配。假设您有标签“Read”和“Reading”,因为这是一个 LIKE 查询,搜索“Read”标签,将返回两者。实际上,解决这个问题的唯一方法是为您的数据添加一个标记定界符,例如:“[Read],[Reading]”。然后,您搜索而不是“[阅读]”,而不是“阅读”,您保证只会拉回正确的。
当我需要像这样打包/解包字符串时,我通常会这样做:
public string Tags
{
get
{
return TagsList != null
? String.Join(",", TagsList.Select(tag => "[" + tag + "]"))
: null;
}
set
{
TagsList = !String.IsNullOrWhiteSpace(value)
? value.Replace("[", "").Replace("]", "").Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).ToList()
: new List<string>();
}
}
[NotMapped]
public List<string> TagsList { get; set; }
这看起来相当复杂,但所有发生的事情是 setter 正在解压缩分隔符上的标签列表,删除我选择使用的短语分隔字符,[
和 ]
。 getter 将列表打包回包含所有内容的字符串。
这样您就可以使用 TagsList
并且字符串版本将自动保留,而无需考虑它。但是,在查询时,您仍然需要查询 Tags
,因为这是实际的数据库支持的属性。
关于c# - Entity Framework 查询一个逗号分隔的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35367621/