gpt4 book ai didi

c# - Entity Framework 查询一个逗号分隔的字段

转载 作者:太空宇宙 更新时间:2023-11-03 19:54:25 24 4
gpt4 key购买 nike

我有一个名为文章的表:

-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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com