我的网站帖子创建了标签来对帖子进行分类。我正在使用标签为帖子创建标签过滤器。 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(',');
给出错误:
taggedPosts
:taggedPosts = taggedPosts.Where(p => p.Tags.Split(',').Select(int.Parse) == id);
给出错误:
IEnumerable<int>
和 int
怀疑Entity Framework Core/LINQ中不支持将
String.Split()
转换为SQL表达式。
唯一的实现方法是从数据库中取出记录并在内存端进行过滤。这可能会牺牲查询性能,因为它将从数据库中获取所有记录。
过滤的概念:
用逗号 (',') 拆分
Tags
并生成字符串数组。
将字符串数组转换为整数数组。
通过
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
};