[asp.net-mvc]实体框架查询以逗号分隔的字段

发布时间: 2017/3/25 4:04:35
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我有一个称为条表︰

-Id
-Title
-Content
-Tags (This is a comma seperated list of tags e.g. 'Sports,Italy,Ferrari')

使用实体框架我想能够找到具有某些标记的所有文章。

List<Article> GetArticles(List<String> tags)
{
  //do an entity framework query here to find all articles which have the tags specified
} 

返回的条目应包含指定的所有标签。 例如如果函数的输入是 '车','蓝',那么应该返回带有这些至少这些 2 的标签的所有条目。

我不能开始想象我如何可以实现这个。 我知道如何实现此使用存储的过程,这是我的 b 计划。

解决方法 1:

存储的过程是实际上是一个不错的选择,如果不是最好的选择,真的。然而,你仍然可以实现它与 Contains :

var articles = db.Articles.Where(m => tags.Any(t => m.Tags.Contains(t)));

这样做基本上遍历传入的标记和创建一个查询,测试是否 Tags 就像任何一项。要记住,因为这要像查询,就要将 sloooooowwwww,除非你 Tags 索引的列,然后也需要这是定义的长度,而不是像 NVARCHAR(MAX) 一样的东西。

另一个潜在问题是错误的匹配结果。让我们说你有标记、"读"和"阅读",因为这是一个类似的查询,搜索"读"标记,将返回两个。真的,在这周围,唯一的方法是将标记分隔符添加到您的数据,例如:"[阅读],[]"。然后在此基础上,您搜索而不是"[读]",而不是"读",,你铁定要只有拉回来,那个合适的人。

当我需要包解包字符串如下所示时,我通常会类似︰

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; }

这看起来相当复杂,但对发生的一切,是二传手拆包上的分隔符,移除我选择使用,短语分隔的字符的标签的列表 [] 。吸气剂包回,所有的字符串列表。

这允许您然后只是使用 TagsList 和字符串版本将自动保留不用去想它。不过,查询时,你仍会有查询 Tags ,因为它是实际的数据库支持的属性。

赞助商