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

标签 c# sql-server asp.net-mvc entity-framework

我有一个名为文章的表:

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

相关文章:

c# - WPF 中带有 INotifyPropertyChanged 的​​绑定(bind)列表

sql - 获取每组最频繁的值

sql-server - SQL查询将一个表中的所有记录插入到另一个现有表中

javascript - MVC - 在ajax调用中操作Jquery插件属性

javascript - 使用knockoutjs映射插件绑定(bind)MVC模型,公开 View 源中的所有数据

c# - 无法连接到远程服务器,但可以在 fiddler 运行 Metro 应用程序时使用

c# - 如何像在 Ruby 中一样创建 c# .net 泛型列表?

c# - 先进先出减数量库存?

sql-server - 无论登录日期格式如何,都将 nvarchar 转换为日期时间?

c# - 如何从不包括查询字符串参数的url获取当前页面