如何解决使用LINQ搜索逗号分隔的字符串
表中有许多记录,并且有一个名为AssignedTo的列,并且AssignedTo的值是逗号分隔的字符串,其可能的值可能类似于:
"1" "2" "3" "11" "12" "1,2" "1,3" "2,3" "1,2,3,11" "1,12"
checkBoxGroupInput
它返回具有AssignedTo值的记录
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),actionButton("button_1","First Options"),actionButton("button_2","Second Options"),hidden(checkBoxGroupInput("options","select the options",c("A","B")))
)
server <- function(input,output,session) {
observeEvent(input$button_1,{
show("options")
updateCheckBoxGroupInput(session,"options",choices = c("A","B"))
})
observeEvent(input$button_2,choices = c("C","D"))
})
}
shinyApp(ui,server)
我真的只想返回包含“ 1”的AssignedTo的记录, 分别是“ 1”,“ 1,2”,“ 1,3”,“ 1,3”,“ 1、3、11”,“ 1、3、12”,不需要“ 11”和“ 12“
如果我使用下面的LINQ查询来搜索合格的记录,则仍然值= 1
records = records.Where(x => x.AssignedTo.Contains(value) || search == null);
它返回AssignedTo值为“ 1,11”,“ 1,12”的记录,但是缺少记录的AssignedTo值为“ 1”。
解决方法
更好的方法是分割字符串并搜索结果:
records = records.Where(x => x.AssignedTo.Split(',').Contains(value) || search == null);
请注意,您无法在EF查询中直接使用此方法,因为无法将其转换为标准SQL。因此,您可能希望使用Contains
作为起点进行过滤(以减少误报的数量),然后在内存中进行过滤:
records = records.Where(x => x.AssignedTo.Contains(value) || search == null)
.AsEnumerable() // do subsequent filtering in-memory
.Where(x => x.AssignedTo.Split(',').Contains(value) || search == null)
或重新设计 您的数据库以使用相关表,而不是存储以逗号分隔的字符串列表...
,由于类似这样的事情很可能是搜索过滤器,因此除非保证行数是可管理的,否则在内存中进行操作可能不是一个很好的选择。理想情况下,应将这样的事情重构为使用适当的关系结构,而不是逗号分隔的字符串。
但是,您所看到的示例大部分都在那儿,只是缺少一个Equals选项来单独捕获值。我也将从Linq表达式中取出'value == null'进行检查,以确定是否要添加WHERE子句。区别在于Linq中的条件,这会将其生成到SQL中,例如,如果没有指定任何值,则通过预先检查可以完全避免SQL条件。
if (!string.IsNullOrEmpty(value))
records = records.Where(x => x.AssignedTo.Contains("," + value + ",") ||
x.AssignedTo.StartsWith(value + ",") ||
x.AssignedTo.EndsWith("," + value) ||
x.AssignedTo == value);
这将捕获“ n,...”,“ ...,n,...”,“ ...,n”和“ n”。
,如果您正在针对数据库构建 linq 表达式,则 Split 函数将引发错误。你可以在下面使用表达式。
if (!string.IsNullOrEmpty(value)) { record = record.Where(x => (',' + x.AssignedTo + ',').Contains(',' + value + ',') }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。