LINQ to SQLを使用するプロジェクトがあります。このプロジェクトでは、クライアントがandまたはanまたは検索を実行するかどうかを選択できるように、いくつかの検索ページを書き直す必要があります。
PredicateBuilderを使用してLINQクエリをやり直すことについては考えましたが、これはかなりうまく機能していると思います。私は事実上、述語を含むクラスを持っています。例:
internal static Expression<Func<Job, bool>> Description(string term)
{
return p => p.Description.Contains(term);
}
検索を実行するために私はこれを行っています(簡潔にするためにいくつかのコードは省略されています):
public Expression<Func<Job, bool>> ToLinqExpression()
{
var predicates = new List<Expression<Func<Job, bool>>>();
// build up predicates here
if (SearchType == SearchType.And)
{
query = PredicateBuilder.True<Job>();
}
else
{
query = PredicateBuilder.False<Job>();
}
foreach (var predicate in predicates)
{
if (SearchType == SearchType.And)
{
query = query.And(predicate);
}
else
{
query = query.Or(predicate);
}
}
return query;
}
私はこれにかなり満足していますが、2つの懸念があります。
- SearchTypeプロパティを評価するif/elseブロックは、潜在的なコードの臭いである可能性があるように感じます。
- クライアントは現在、'/'または'ではない'検索を実行できることを主張しています。
ポイント2に対処するために、私は自分の表現を書き直すだけでこれを行うことができると思います。
internal static Expression<Func<Job, bool>> Description(string term, bool invert)
{
if (invert)
{
return p => !p.Description.Contains(term);
}
else
{
return p => p.Description.Contains(term);
}
}
ただし、これはちょっとした悩みの種のように感じます。これは通常、より良い解決策があることを意味します。誰かがこれをどのように改善できるかをお勧めできますか?私は動的LINQを知っていますが、LINQの強い型付けを失いたくありません。