うん。彼は、パフォーマンス上の理由から、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