我正在编写一个查询框架,并试图使其尽可能通用。
假设我有一个基于人员的查询,并且我希望能够过滤名字和姓氏,并且在这两种情况下我都希望能够使用过滤条件,例如StartsWith
, ' EndsWith
, Contains
, Equals
。
所以现在我有一个方法:
private Expression<Func<Person, bool>> FirstNameFilter(Comparator comparator, string compareValue) {
switch (comparator) {
case Comparator.Equal:
return p => p.FirstName == compareValue;
case Comparator.Contains:
return p => p.FirstName.Contains(compareValue);
case Comparator.StartsWith:
return p => p.FirstName.StartsWith(compareValue);
// etc.
}
}
现在,我还希望能够为 LastName 构建相同的过滤器。重新复制和粘贴整个内容似乎很愚蠢和浪费,只需替换p.FirstName
为p.LastName
. 我还有一堆我想过滤的其他字符串字段,我真的不想为每个字段重写整个方法!
有没有办法抽象这个,也许使用LinqKit,这样我就可以提出一个更通用的方法,具有以下近似签名:
Expression<Func<Person, bool>> GetFilter(Expression<Func<Person, string>> stringExpression, Comparator comparator, string compareValue) {}
这样我就可以在里面FirstNameFilter
像这样调用它:
return GetFilter(p => p.FirstName, comparator, compareValue);