Здравствуйте. Возник очень тяжелый вопрос с которым я никогда не сталкивался. мне нужно создать метод, который поймет по какому свойству нужно сделать фильтр. Т.е., допустим у меня есть класс
public class User {
public string Name {get; set;}
public string Nick {get; set;}
}
И мне нужно вытащить из базы некоторых пользователей но критерий заранее не известен, в запросе Name или Nick могут быть null.
В данный момент это выглядит примерно так:
//это часть когда находится в классе user
IQarable
if (!string.IsNullOrEmpty(Name))
{
query = query.Where(x => x.VenueName.Contains(Venue));
}
if (!string.IsNullOrEmpty(Nick))
{
query = query.Where(x => x.City.Contains(City));
} //и так далее
Внутри блоков If есть еще кое какая проверка, вот поэтому я пытаюсь это вынести в 1 метод, но не в этом суть.
Я пытаюсь сделать метод, который принимает query и свойство в виде строки, по которому нужно выполнить Where(...), что бы это выглядело так
if (!string.IsNullOrEmpty(Name))
{
query = SearchMethod(query, "Name", "Jhon");
}
Я не могу представить как мне заменить выражение Where(x => x./*тут свойство, которое каким-то образом определено*/.Contais("SearchingValue")) что-то другое, что может вычислить свойство по которому я веду поиск, и подставить его в это выражение. По рефлексии я смог получить только само свойство.
Type t = this.GetType();
PropertyInfo prop = t.GetProperty("EventName");
Прошу вашей помощи в решении этой проблемы.
Ответ
Отфильтровать IQueryable по Func
Для вашего случая, если нужно сравнивать значение с константой, можно сделать так (не тестировал, возможны вылеты в рантайме):
IQueryable
Expression
Пользоваться так:
query = Filter(query, x => x.Name, "Jhon");
Внутри Filter можно накрутить, понятно, более сложную логику.
Если всё же очень хочется потерять проверки на этапе компиляции и передавать имена свойств как строки, можно так:
IQueryable
Expression
и пользоваться так:
query = Filter(query, "Name", "Jhon");
Понятна схема?
Для примера, если вам нужно Contains
Expression
Как подсказывает в комментарии @Pavel Mayorov, последнюю функцию можно переписать проще:
Expression
Комментариев нет:
Отправить комментарий