1

私はこのサイトでいくつかの質問をしてきましたが、多くの小さなことへの答えがありますが、今はすべてをつなぎ合わせようとしています.

データベースにあるすべてのプロパティを表示するページがあります。ただし、これらの結果を絞り込む方法を見つける必要があります。たとえば、寝室が 4 つある物件のみを表示するなどです。問題は、検索用語に含まれる変数の数がまだわからないことです。これが例です。

  1. ユーザーは、寝室が 4 つしかないすべての物件を見たいと思うかもしれません。
  2. ユーザーは、4 つのベッドルームと 3 つのバスルームがあり、8 人が宿泊できるすべての物件を見たいと思うかもしれません。

クエリ文字列 ?numbedrooms=4&?numbathrooms=3 からすべての変数を取得することにしました。

これまでのコードは次のとおりですが、機能しません。

@{
var db = Database.Open("StayInFlorida");

IEnumerable<dynamic> queryResults;

int numBedrooms = Request.QueryString["numBedrooms"].AsInt();
int numBathrooms = Request.QueryString["numBathrooms"].AsInt();
int sleeps = 0;

List<int> argList = new List<int>();

if (Request.QueryString["sleeps"].IsInt())
{
sleeps = Request.QueryString["sleeps"].AsInt();
}

int numOfArguments = 0;

string selectQueryString = "SELECT * FROM PropertyInfo ";

if (numBedrooms != 0)
{
argList.Add(numBedrooms);
selectQueryString += "WHERE numBedrooms = @0 ";

numOfArguments++; //increment numOfArguments by 1
}

if (numBathrooms != 0)
{
argList.Add(numBathrooms);
if (numOfArguments == 0)
{
    selectQueryString += "WHERE numBathrooms = @0 ";
}
else
{
    selectQueryString += "AND numBathrooms = @" + numOfArguments + " ";
}
numOfArguments++;
}

if (sleeps != 0)
{
argList.Add(sleeps);
if (numOfArguments == 0)
{
    selectQueryString += "WHERE sleeps = @0 ";
}
else
{
    selectQueryString += "AND sleeps = @" + numOfArguments + " ";
}
numOfArguments++;
}

selectQueryString += "ORDER BY numBedrooms DESC"; //Adjust this order by clause how you see fit.

int[] argArray = argList.ToArray();

if (argArray.Length > 0)
{
queryResults = db.Query(selectQueryString, argArray); //stores a dynamic list to 'queryResults' which can later be easily iterated through with a 'foreach' list and written to the page with razor.
}
}



<!--Results Start-->

@foreach(var row in queryResults){
<div class="container">

                <h4><a href="/property.cshtml?propertyid=@row.PropertyID">@row.PropertyName</a></h4>
                <h5>Bedrooms: @row.NumBedrooms Bathrooms: @row.NumBathrooms Sleeps: @row.NumSleeps</h5>


</div>
}
<!--Results Finish-->

明確にするために、検索クエリごとにクエリ文字列エントリがあるかどうかを確認する方法を見つける必要があります。ある場合は、それを SQL ステートメントに追加して、一致するすべての結果を表示する必要があります。

4

1 に答える 1

2

主に、必要と思われるのは、優れた「ユーザー インターフェイス」ページです。

そのページ内には、いくつかのフォーム入力要素 (ラジオ ボタン、テキスト ボックス、チェックボックスなど) があり、空白のままの場合は無視されますが、そうでない場合は、必要な SQL 構文を検出して、それに応じて SQL 文字列に追加します。 .

たとえば、最初の (ユーザー入力) ページにこのフォームがあったとしましょう (これを と呼びましょうpage1.cshtml):

<!--[HTML]-->
<form action="~/page2.cshtml" method="GET">
    <select name="numBedrooms">
        <option value="0">Please Select</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
    </select>
    <select name="numBathrooms">
        <option value="0">Please Select</option>
        <option value="1">1</option>
        <option value="2">2</option>
        <option value="3">3</option>
        <option value="4">4</option>
    </select>
    <input type="text" maxlength="3" name="sleeps" />
</form>

もちろん、このフォームの実行可能なオプションと入力フィールドのタイプは、特定のシナリオに完全に適していますが、アイデアは理解できると思います.

page2.cshtml次に、 SQL 文字列の作成を開始するファイルの部分で、次のようにします。

/*[C#]*/
var db = Database.Open("StayInFlorida");
int numBedrooms = Request.QueryString["numBedrooms"].AsInt();
int numBathrooms = Request.QueryString["numBathrooms"].AsInt();
int sleeps = 0;
List<int> argList = new List<int>();

if (Request.QueryString["sleeps"].IsInt())
{
    sleeps = Request.QueryString["sleeps"].AsInt();
}

int numOfArguments = 0;

string selectQueryString = "SELECT * FROM PropertyInfo ";

この文字列は、他に何も追加されていない場合は正常に機能し、構文エラーなしでデータベース内のすべてのエントリを照会するだけであることに注意してください (SQL は末尾に余分なスペースがあっても気にしません。これは知っておくとよいでしょう)。 、それはあなたの人生を楽にするからです)。ただし、以前からこのページに渡された情報を確認し、それに応じて SQL 文字列に追加することができます。

また、適切な数のunknown-until-runtimeパラメーターを渡しながらデータベースにクエリを実行する最も簡単な方法は、db.Queryメソッドに配列を渡すことです。したがって、有効であるとテストされた各パラメーターは、リストに追加され、後で配列に変換されます (C# では未知のサイズの配列を定義できないため、最初にリストを使用しますが、リストを使用すると、必要に応じて値を追加します)。

if (numBedrooms != 0)
{
    argList.Add(numBedrooms);
    selectQueryString += "WHERE numBedrooms = @0 ";

    numOfArguments++; //increment numOfArguments by 1
}

if (numBathrooms != "0")
{
    argList.Add(numBathrooms);
    if (numOfArguments == 0)
    {
        selectQueryString += "WHERE numBathrooms = @0 ";
    }
    else
    {
        selectQueryString += "AND numBathrooms = @" + numOfArguments + " ";
    }
    numOfArguments++;
}

if (sleeps != 0)
{
    argList.Add(sleeps);
    if (numOfArguments == 0)
    {
        selectQueryString += "WHERE sleeps = @0 ";
    }
    else
    {
        selectQueryString += "AND sleeps = @" + numOfArguments + " ";
    }
    numOfArguments++;
}

selectQueryString += "ORDER BY numBedrooms DESC"; //Adjust this order by clause how you see fit.

データがデータベースに格納される方法 (nvarchar、int など) によっては、SQL 文字列内でキャストを使用するか、C# で解析するか、単に selectQueryString の記述方法を調整する必要がある場合があることに注意してください。 、しかし、データ型/変換はこの質問の範囲外であるため、これ以上詳しくは説明しません。

次に、引数のリストを配列に変換します。

int[] argArray = argList.ToArray();

最後に、データベースにクエリを実行するだけです。ただし、リストを送信した配列が空でないことも確認する必要あります (これは、変換したときにリストが空であることが原因である可能性が最も高いでしょう)。メソッドの 2 番目の引数として空の配列を渡すと、サーバー側のエラーが発生しますdb.Query()

if (argArray.Length > 0)
{
    var queryResults = db.Query(selectQueryString, argArray); //stores a dynamic list to 'queryResults' which can later be easily iterated through with a 'foreach' list and written to the page with razor.

    //put your "foreach (var row in queryResults)" loop here.
}

そして、本当にそれだけです。唯一のことは、これを特定のデータ型で機能させるために批判しなければならないことがたくさんあるということです(フォームページからのものですが、特にデータベース内に保存されているため)。

于 2013-09-03T15:48:55.457 に答える