微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用LINQ搜索逗号分隔的字符串

如何解决使用LINQ搜索逗号分隔的字符串

表中有许多记录,并且有一个名为AssignedTo的列,并且AssignedTo的值是逗号分隔的字符串,其可能的值可能类似于:

"1"
"2"
"3"
"11"
"12"
"1,2"
"1,3"
"2,3"
"1,2,3,11"
"1,12"

如果我使用以下LINQ查询进行搜索,则值= 1

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 举报,一经查实,本站将立刻删除。