1

ユーザーがデータベースを検索するために選択する 2 つのドロップダウン リストと 3 つのチェックボックス セクションを含むフォームがあります。すべてのテーブルが小さいため、単一の SELECT ステートメントを使用して結果を返したいと思います。mikesdotnetting で、単一の IN 句でうまく機能する拡張機能を見つけました

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);
}
 }

これは、クエリをどのように想定するかを示すページ コードです。

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);

拡張機能はそれほど多くの引数を取ることができないため、これは明らかに機能しません。クラスを変更して追加のパラメーターを許可し、1 回の実行でクエリを実行できるようにする方法を探しています。これは不可能な場合があります。

また、単一のパラメーター化された in 句の処理を処理するスレッドをいくつか見つけましたが、変数リストを使用した倍数については実際には言及していません。

私はストアド プロシージャや独自のクラスの記述に慣れていません。助言がありますか?

4

0 に答える 0