按逗号分隔数据过滤

问题描述 投票:0回答:1

我的网站帖子创建了标签来对帖子进行分类。我正在使用标签为帖子创建标签过滤器。 StackOverflow 标签部分 作为示例。

我正在使用 MSSQL 数据库 列,该列存储用逗号分隔的多个行 ID。

这是一个例子:

身份证 标题 标签
1 标题1 1,2,3
2 标题 2 3,4,7
... ... ...

我想在控制器操作中使用逗号分隔它们,但我面临一些问题:

控制器动作方法:

[HttpGet]
public async Task<IActionResult> Detail(int id)
{
    var taggedPosts = from p in _context.Posts select p;

    taggedPosts = taggedPosts.Where(p => int.Parse(p.Tags) == id);
    
    var Tags = new DetailTagsViewModel
    {
        PostCard = await taggedPosts.ToListAsync()
    };

    return View(Tags);
}

我尝试过使用

p.Tags
来分离
.Split(',')
但它不起作用。

这是我尝试过的:

  • 创建一个新变量
    splitTags
    :
var splitTags = from p in _context.Posts select p.Tags.Split(',');

给出错误:

  1. CS0854 - 表达式树可能不包含使用可选参数的调用或调用。
  2. CS8602 - 取消引用可能为空的引用。
  • 修改变量
    taggedPosts
    :
taggedPosts = taggedPosts.Where(p => p.Tags.Split(',').Select(int.Parse) == id);

给出错误:

  1. CS0019 - 运算符 '==' 不能应用于
    IEnumerable<int>
    int
  2. 类型的操作数
  3. CS8602 - 取消引用可能为空的引用。
c# filter entity-framework-core asp.net-core-mvc
1个回答
1
投票

怀疑Entity Framework Core/LINQ中不支持将

String.Split()
转换为SQL表达式。

唯一的实现方法是从数据库中取出记录并在内存端进行过滤。这可能会牺牲查询性能,因为它将从数据库中获取所有记录。

过滤的概念:

  1. 用逗号 (',') 拆分

    Tags
    并生成字符串数组。

  2. 将字符串数组转换为整数数组。

  3. 通过

    id
    评估整数中存在的
    .Contains()

var taggedPosts = await (from p in _context.Posts select p)
    .ToListAsync();

taggedPosts = taggedPosts.Where(p => p.Tags
        .Split(',')
        .Select(x => Convert.ToInt32(x))
        .Contains(id))
    .ToList();
    
var Tags = new DetailTagsViewModel
{
    PostCard = taggedPosts
};
© www.soinside.com 2019 - 2024. All rights reserved.