1

私は c# .NET を使用しています。

txtName、txtSirname、txtLocation の 3 つのフィールド (テキスト ボックス) があります。

私のデータベーステーブルは

Name      | Sirname  | Location

Steve     | Jobs     | US
Kevin     | Peterson | UK
Haechelle | Gibbs    | South Africa

検索ボタンは 1 つです。検索ボタンをクリックすると、テキスト boxex に従ってすべての結果を表示したいと考えています。

しかし

すべてのテキスト ボックスが空の場合、テーブル全体を表示したい。name が空の場合、sirname と place に従って結果を表示する必要があります。sirname が空の場合、名前と場所に従って結果を表示する必要があります。name と sirname が空の場合...および可能なすべての組み合わせ。

私の問題は、C# で if ステートメントを使用できないことです。1 つの SQL クエリでのみ記述する必要があります。どうすればいいですか。私に指示してください。

4

3 に答える 3

3

うん。彼は、パフォーマンス上の理由から、10 個の if を避け、単一のクエリを作成する必要があると言っています。

彼は全く単純に間違っています。すべての組み合わせに対応する TSQL の石畳のクエリを介してこれを行うと、そのクエリは最適に実行されなくなります (そして、パラメーター スニッフィングのパフォーマンスの痛みに対して特に脆弱になります)。

率直に言って、私は彼を無視し、正しいクエリを C# コードに記述します。これは事実上瞬時に (マイクロ秒単位で) 行われます。データベース サーバーに不適切な TSQL クエリを実行するように要求すると、非常にコストがかかります。たとえば、生の TSQL での累積フィルターの完全な実装は次のとおりです。

static void AppendClause(StringBuilder clause, string tsql)
{
    clause.Append(clause.Length == 0 ? " where " : " and ")
          .Append('(').Append(tsql).Append(')');
}    
static Foo[] SearchFoo(string name, int? age, string region)
{
    var whereClause = new StringBuilder();
    if (name != null) AppendClause(whereClause, "f.Name=@name");
    if (age != null) AppendClause(whereClause, "f.Age=@age");
    if (region != null) AppendClause(whereClause, "f.Region=@region");

    string tsql = "select f.* from Foo f" + whereClause;
    using (var conn = GetConnection())
    { // note I'm using "dapper" here for brevity, but any ADO.NET-based
      // code would suffice
        return conn.Query<Foo>(tsql, new { name, age, region }).ToArray();
    }
}

またはLINQでも同じ:

static Foo[] SearchFoo(string name, int? age, string region)
{
    using (var ctx = GetContext())
    {
        IQueryable<Foo> query = ctx.Foos;
        if(name != null) query = query.Where(f => f.Name == name);
        if(age != null) query = query.Where(f => f.Age == age);
        if(region != null) query = query.Where(f => f.Region == region);
        return ctx.ToArray();
    }
}

あなたの同僚は非常に間違っています。それでも彼が同意しない場合は、遠慮なく彼を私の方向に向けてください ;p

于 2012-11-24T14:43:16.823 に答える
3

使用する

WHERE     
    ([Name] = @name OR @name IS NULL) OR
    ([Sirname] = @sirname OR @sirname IS NULL) OR
    ([Location] = @location OR @location IS NULL)

テキストボックスが空の場合NULLは、クエリ/sproc のパラメーターの値として渡します。

于 2012-11-24T14:22:41.133 に答える
1
select ... from ... where
    name = isnull(nullif(@name, ''), name) and
    sirname = isnull(nullif(@sirname, ''), sirname) and
    location = isnull(nullif(@location, ''), location)

パラメータを省略したいときはいつでも、文字列を渡すnullか空にしてください。、およびはパラメーターです""@name@sirname@location

于 2012-11-24T14:33:48.460 に答える