在 ASP.NET Core MVC 中过滤拆分数据

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

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

我正在使用MSSQL数据库列存储不同表的多个行ID,每个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(',')
但它不起作用。

这是我尝试过的:

  • 创建新变量
    var 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 asp.net-core-mvc tags
1个回答
0
投票

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

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

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

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));
    
var Tags = new DetailTagsViewModel
{
    PostCard = taggedPosts.ToList()
};
© www.soinside.com 2019 - 2024. All rights reserved.