是的。他告诉我,出于性能原因,我应该避免 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