C# 使用实体框架搜索逗号分隔的值

C# 使用实体框架搜索逗号分隔的值,c#,asp.net,asp.net-mvc,entity-framework,asp.net-core,C#,Asp.net,Asp.net Mvc,Entity Framework,Asp.net Core,我有以下字符串3,9,我想在数据库表中搜索它的2个值(3和9),如下所示 因此,如果我的字符串只包含数字3,我的查询应该返回所有5行,如果我发送数字9,它应该只返回2行,如果我发送3,9,它也应该返回所有5行 我在课堂上写代码有困难 var t = GetAll() if (!string.IsNullOrEmpty(ApproversId)) { List<string> ApproversIdL = ApproversId.Split(

我有以下字符串3,9,我想在数据库表中搜索它的2个值(3和9),如下所示

因此,如果我的字符串只包含数字3,我的查询应该返回所有5行,如果我发送数字9,它应该只返回2行,如果我发送3,9,它也应该返回所有5行

我在课堂上写代码有困难

var t = GetAll()
 if (!string.IsNullOrEmpty(ApproversId))
        {
            List<string> ApproversIdL = ApproversId.Split(',').ToList();
            // this is where i am having trouble
            t = t.Where(s => s.AproversIds.Any(x=>x.ToString()== ApproversIdL.Any(x=>x.ToString())));                                
        }
var t=GetAll()
如果(!string.IsNullOrEmpty(ApproversId))
{
List ApproversIdL=ApproversId.Split(',').ToList();
//这就是我遇到麻烦的地方
t=t.Where(s=>s.AproversIds.Any(x=>x.ToString()==ApproversIdL.Any(x=>x.ToString()));
}

感谢您的帮助我想
t=GetAll()
是一个包含行的列表

因此,您必须以与拆分
ApproversId
参数相同的方式拆分每个
t.AproversIds
列值,并检查是否存在交叉点

var ApproversIdL = ApproversId.Split(',');
t = t.Where(s => s.AproversIds.Split(',').Any(p => ApproversIdL.Contains(p) ));

我在想我们怎样才能搜索多个值,然后得出了这个结论:P

Dictionary<int, string> data = new Dictionary<int, string>();
data.Add(1, "3,97");
data.Add(2, "9,3");
data.Add(3, "3");
data.Add(4, "3");
data.Add(5, "3,4");

//search string with comma separated value
string searchItems = "9";
var tempSearchItems = searchItems;

searchItems = searchItems.Replace(",", "|").Replace(" ", "");

//Pattern for the regex
string pattern = @"\b(" + searchItems + @")\b";

//get the result
var test = data.Where(d => Regex.Matches(d.Value, pattern).Count > 0).ToList();
字典数据=新字典();
数据。添加(1,“3,97”);
数据。添加(2,“9,3”);
数据。添加(3,“3”);
数据。添加(4,“3”);
数据。添加(5,“3,4”);
//带逗号分隔值的搜索字符串
字符串searchItems=“9”;
var tempSearchItems=searchItems;
searchItems=searchItems.Replace(“,”,“|”).Replace(“,”);
//正则表达式的模式
字符串模式=@“\b(“+searchItems+@”)\b”;
//得到结果
var test=data.Where(d=>Regex.Matches(d.Value,pattern).Count>0.ToList();

让我知道它是否有帮助如果您使用SQL Server,那么您可以使用将数据库结果集过滤到可管理的数据子集,然后使用正则表达式提取内存中的项。

这里是一个您可以参考的工作演示

 public async Task<IActionResult>  Test()
    {
        var ApproversId = "3,9";
        var t = (from a in _context.Answers
                select a).ToList();
        if (!string.IsNullOrEmpty(ApproversId))
        {
            List<string> ApproversIdL = ApproversId.Split(',').ToList();
            t = t.Where(s => ApproversIdL.Any(al=>s.AproversIds.Contains(al))).ToList();

        }
        return View();
    }
公共异步任务测试()
{
var ApproversId=“3,9”;
var t=(来自于上下文中的a)
选择一个.ToList();
如果(!string.IsNullOrEmpty(ApproversId))
{
List ApproversIdL=ApproversId.Split(',').ToList();
t=t.Where(s=>ApproversIdL.Any(al=>s.AproversIds.Contains(al)).ToList();
}
返回视图();
}
结果:

是EntityFramework还是EntityFrameworkCore?是EntityFramework Coref是一种ORM,因此真正的答案是使用关系模式,在本例中是多对多映射。即,如果这是一个提交表,其中一个提交可以有多个审批人,并且一个审批人链接到多个提交,则有一个SubmissionApprovers表。因此,您可以在数据库级别执行这些筛选器检查,而不是首先将所有数据加载到内存中。我尝试了此操作,但此's.AproversIds.Split(',')'给出的错误是:表达式树可能不包含使用可选参数的调用或调用响应中似乎有输入错误。Try:
var approversIdL=approversId.Split(“,”);var matchingList=t.Where(x=>x.Split(“,”).Any(p=>approversIdL.Contains(p))否,它是相同的issue@lzydrmr这是因为我现在理解的
GetAll()
返回
IQueryable
,并且局部变量未启用@Sora恐怕您可以尝试通过带有输入参数的存储过程来解决它。或者应该使用
普通T-SQL方法
不使用c#变量来解决这个问题references@oleksa谢谢你的澄清。或者,您可以将
IQueryable
转换为
列表
(通过调用
ToList()
)。但是,在生产设置中,这可能不利于性能。在这个特殊示例中,这可能会起作用,但如果搜索项包含由正则表达式引擎解释的字符(例如星号),则会导致问题。问题是关于EntityFramework,和
GetAll
返回
IQueryable
(而不是
IEnumerable
)。然后,它被追加
,其中
,并被转换为SQL。在开始枚举
GetAll()
result这是一个有趣的场景之前,程序内存中实际上没有数据。拆分不会调用内存中的数据吗?这是否意味着在执行拆分时查询已经执行?此外,如果数据包含两位数,而搜索字符串包含一位数,则Contains将给出错误匹配。