如何使用contain子句查询多个参数

本文关键字:参数 查询 子句 何使用 contain | 更新日期: 2023-09-27 18:00:37

我正在尝试(/api/data?name=storm,bcam&tag=78473TAC412669VAC2),但它一直输出"无数据响应"消息
我用sql测试了同一个查询,它输出了10条记录。

select *
from [dbo].[database_bd]
where TAG like '%78473TAC4%' 
or TAG LIKE '%012669VAC2%' 
OR NAME LIKE '%BCAM%' 
OR NAME LIKE '%STORM%' 

我尝试了许多不同的方法来返回数据并将其添加到列表中,但总是收到"无数据"的消息。

    var data = db.database_bd.AsQueryable();
        if (query.startDate != null)
        {
            data = data.Where(c => c.UploadDate >= query.startDate);
        }
        if (!string.IsNullOrEmpty(query.name))
        {
                var list = query.name.Split(',');
                foreach (string i in list)
                {
                    data = data.Where(c => list.Any(a => c.NAME.Contains(i)));
                }
        }
        if (!string.IsNullOrEmpty(query.tag))
        {
            var list = query.tag.Split(',');
            foreach (string i in list)
            {
                data = data.Where(c => list.Any(a => c.TAG.Contains(i)));
            }
        }       
        if (!data.Any())
        {
            var message = string.Format("No data found");
            return Request.CreateErrorResponse(HttpStatusCode.NotFound, message);
        }
        return Request.CreateResponse(HttpStatusCode.OK, data);
    }

如有任何帮助,我们将不胜感激。非常感谢。

如何使用contain子句查询多个参数

我看到了一个潜在的错误。

你的第二个if块(在Tag上过滤)实际上是"过滤掉"你从第一个if块得到的结果!!因此,有效地说,您正在执行"与"运算。这与您的SQL查询正在执行的操作不同。

有效地,像这样读取你的两个if块:

data = data.Where(c => list.Any(a => c.NAME.Contains(nameArg)).Where(c => list.Any(a => c.TAG.Contains(tagArg)));

相反,理想情况下,两个if块都应该处理"originalData",然后将匹配项合并到"resultData"。

这正是你所需要的。仪式

我建议使用像SQL Profiler或EFProf这样的分析工具来查看查询实际生成的SQL。从那里应该可以更容易地进行故障排除。