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

时间:2014-04-28 14:36:41

标签: c# sql linq entity-framework asp.net-web-api

我正在尝试(/ api / data?name = storm,bcam& tag = 78473TAC4,12669VAC2),但它不断输出“无数据响应”。客户端的消息。
我用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);
    }

非常感谢任何帮助。谢谢。

2 个答案:

答案 0 :(得分:0)

我建议使用SQL Profiler或EFProf等分析工具来查看您的查询实际生成的SQL。从那里开始排除故障应该更容易。

答案 1 :(得分:0)

我看到一个潜在的错误。

你的第二个if块(过滤标签)实际上是“过滤掉”你从第一个块获得的结果!如此有效,您正在进行“与”操作。这与您的SQL查询正在执行的操作不同。

有效地,阅读你的两个如果这样的块:

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

相反,两个if块理想地应该在“originalData”上工作,然后将匹配合并到“resultData”。

这就是你所需要的。 RITE?