Вы можете заменить search
вторым делегатом, как показано ниже:
private void searcher(ref Expression<Func<Party, bool>> predicate, Func<string, string, bool> searchPredicate, string keyword, string column)
{
if (column == "surname") predicate = predicate.And(p => searchPredicate(p.surname, keyword));
if (column == "lastname") predicate = predicate.And(p => searchPredicate(p.lastname, keyword));
if (column == "comment") predicate = predicate.And(p => searchPredicate(p.comment, keyword));
if (column == "position") predicate = predicate.And(p => searchPredicate(p.position, keyword));
}
Тогда вы можете свободно передавать любой делегат, который вызывает строку и возвращает bool:
searcher(yourFirstPredicate, (s, k) => s.Contains(k), column);
или , если вы действительно хотите использовать слово в качестве ключа для делегата поиска, вы можете определить метод для возврата вашего делегата:
private static Func<string, string, bool> searchSwitcher(string searchType)
{
switch(searchType)
{
case "end":
return (s, k) => s.EndsWith(k);
case "start":
return (s, k) => s.StartsWith(k);
default:
return (s, k) => s.Contains(k);
}
}
Затем измените свойМетод искателя () для:
private void searcher(ref Expression<Func<Party, bool>> predicate, string search, string keyword, string column)
{
var searchDelegate = searchSwitcher(search);
if (column == "surname") predicate = predicate.And(p => searchDelegate(p.surname, keyword));
if (column == "lastname") predicate = predicate.And(p => searchDelegate(p.lastname, keyword));
if (column == "comment") predicate = predicate.And(p => searchDelegate(p.comment, keyword));
if (column == "position") predicate = predicate.And(p => searchDelegate(p.position, keyword));
}