我正在使用c#.NET。
我有3个字段(文本框)txtName,txtSirname,txtLocation。
我的数据库表是
Name | Sirname | Location
Steve | Jobs | US
Kevin | Peterson | UK
Haechelle | Gibbs | South Africa
我有一个搜索按钮。在点击搜索按钮时,我想根据文本框显示所有结果。
BUT
如果所有文本框都为空,我想显示整个表格。 如果name为空,那么它应该根据sirname和place显示结果。 如果sirname为空,则应根据名称和位置显示结果。 如果name和sirname为空......以及所有可能的组合。
我的问题是我不允许在C#中使用if语句。我只能在一个SQL查询中编写它。我该怎么办请指导我。
答案 0 :(得分:3)
使用
WHERE
([Name] = @name OR @name IS NULL) OR
([Sirname] = @sirname OR @sirname IS NULL) OR
([Location] = @location OR @location IS NULL)
如果您的文本框为空,则将NULL
作为查询/ sproc中参数的值传递。
答案 1 :(得分:3)
耶。他告诉我,我应该避免10个ifs并为性能原因写一个查询
他完全错了。如果您通过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
答案 2 :(得分: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
是参数。