1

我正在使用 c# .NET。

我有 3 个字段(文本框)txtName、txtSirname、txtLocation。

我的数据库表是

Name      | Sirname  | Location

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

我有一个搜索按钮。单击搜索按钮时,我想根据文本框显示所有结果。

如果所有文本框都是空的,我想显示整个表格。如果 name 为空,则应根据 sirname 和 place 显示结果。如果 sirname 为空,则应根据名称和地点显示结果。如果 name 和 sirname 为空......以及所有可能的组合。

我的问题是我不允许在 C# 中使用 if 语句。我只需要在一个 SQL 查询中编写它。我该怎么做。请指导我。

4

3 回答 3

3

采用

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

如果您的文本框是空NULL的,则将其作为查询/存储过程中的参数值。

于 2012-11-24T14:22:41.133 回答
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 回答
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 回答