[英]EF Core how to use linq to match field stores as string but contains items separated by a delimiter
例如。 这个表,我想搜索标有“c”的项目,而不是“c#”或“c++”。 标签由空格分隔。
ID | BookName | Tags
1 | C++ Primer | c++
2 | .NET Core 3.1 Tutorial | c# .net
3 | Beginner Tutorial | c c# c++
每个图书记录都可以标记多个标签,如果我使用
dbContext.Book.Where(a => a.Tags.Contains("c")).ToList()
我会得到所有的。 但我只想得到初学者教程。 因为我不能使用=
来过滤标签字段。 我该如何解决这个问题?
PS:我也不能改变这个表的结构。
您可以在分隔符上拆分标签字段(在您的情况下为空格)并验证标签是否存在。 例如
var result = dbContext.Book.Where(a => a.Tags.Split(' ').Contains("c"));
您需要首先按空格Split
标签,然后您可以使用Contains
或Any
通过使用Contains
执行此操作:
var result = dbContext.Book.Where(a => a.Tags.Split(' ').Contains("c"));
通过使用Any
执行此操作:
var result = dbContext.Book.Where(a => a.Tags.Split(' ').Any(t => t.Equals("c")))
这些会给你预期的结果。
您还可以检查包含和任何在 linq 之间的差异
var result = dbContext.Book.Where(a => a.Tags.Split(' ').Any(t => t.Equals("c")))
您也可以通过正则表达式来完成。
Regex regex = new Regex(@"^c$| c|c ");
var result = books.Where(a => regex.Match(a.Tags).Success);
修改您的模型如下:
public string Tags
{
get
{
return TagsList != null
? String.Join(" ", TagsList.Select(tag => tag ))
: null;
}
set
{
TagsList = !String.IsNullOrWhiteSpace(value)
? value.Split(new[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToList()
: new List<string>();
}
}
[NotMapped]
public List<string> TagsList { get; set; }
然后使用:
dbContext.Books.Where(a=>a.TagsList.Contains("c"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.