我们有一个使用 LINQ to SQL 的项目,为此我需要重写几个搜索页面以允许客户端选择是否希望执行and或 an or搜索。
我虽然关于使用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;
}
虽然我对此感到相当满意,但我有两个担忧:
- 评估 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 的强类型。