Asp.net 选择具有多个参数化in子句的查询
我有一个表单,其中有2个下拉列表和3个复选框部分,用户可以从中选择来搜索数据库。因为所有的表都很小,所以我想使用一个SELECT语句来返回结果。我在mikesdotnetting上发现了一个扩展,它可以很好地处理单个IN子句Asp.net 选择具有多个参数化in子句的查询,asp.net,sql,sql-server,razor-2,Asp.net,Sql,Sql Server,Razor 2,我有一个表单,其中有2个下拉列表和3个复选框部分,用户可以从中选择来搜索数据库。因为所有的表都很小,所以我想使用一个SELECT语句来返回结果。我在mikesdotnetting上发现了一个扩展,它可以很好地处理单个IN子句 using System; using System.Collections.Generic; using WebMatrix.Data; using System.Linq; public static class DatabaseExtensions { public
using System;
using System.Collections.Generic;
using WebMatrix.Data;
using System.Linq;
public static class DatabaseExtensions
{
public static IEnumerable<dynamic> QueryIn(this Database db, string commandText, string values)
{
if (string.IsNullOrEmpty(values))
throw new ArgumentException("Value cannot be null or an empty string", "values");
var temp = values.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var temp2 = values.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var temp3 = values.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var parms = temp.Select((s, i) => "@" + i.ToString()).ToArray();
var parms2 = temp2.Select((s, i) => "@" + i.ToString()).ToArray();
var parms3 = temp3.Select((s, i) => "@" + i.ToString()).ToArray();
var inclause = string.Join(",", parms, parms2, parms3);
return db.Query(string.Format(commandText, inclause), temp, temp2, temp3);
}
public static int ExecuteIn(this Database db, string commandText, string values)
{
if (string.IsNullOrEmpty(values))
throw new ArgumentException("Value cannot be null or an empty string", "values");
var temp = values.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var parms = temp.Select((s, i) => "@" + i.ToString()).ToArray();
var inclause = string.Join(",", parms);
return db.Execute(string.Format(commandText, inclause), temp);
}
}
这显然不起作用,因为扩展不能接受那么多参数。我正在寻找一种方法来修改该类,以允许添加额外的参数,以便查询只需执行一次即可运行。这可能是不可能的
此外,我还发现了几个线程处理单个参数化in子句,但没有真正提到带有变量列表的多个线程
我不擅长存储过程或编写自己的类。有什么建议吗?当时有人向我提出了这个问题的部分解决方案。这正确地构建了查询,但我仍然无法将复选框值作为查询参数传递回(代码的temp部分)。
var gender = Request["genderSvd"];
var person = Request["chkPerson"];
var spec = Request["chkSpec"];
var county = Request["ctyLoc"];
var crim = Request["chkCrim"];
var db = Database.Open("HBDatabase");
var sql = "SELECT DISTINCT tblProgram.* FROM lnkPrgPersonSvd INNER JOIN tblProgram ON lnkPrgPersonSvd.prgId = tblProgram.prgId";
sql += "INNER JOIN lnkPrgSpecial ON tblProgram.prgId = lnkPrgSpecial.prgId INNER JOIN tblProgram.prgId = lnkPrgCriminal.prgId ";
sql += "WHERE (lnkPrgPersonSvd.personId IN ({0})) AND (lnkPrgSpecial.specId IN ({1})) AND tblProgram.prgGenderSvdId = @2 ";
sql += "AND tblProgram.prgCounty = @3 AND (lnkPrgCriminal.criminalId IN ({4}))";
var prgList = db.QueryIn(sql, person, spec, gender, county, crim);