IQueryable
может быть отфильтровано с использованием метода Where
. Этот метод также возвращает IQueryable
, поэтому, если вы хотите (и я часто это делаю), вы можете объединить их в цепочку для многократной фильтрации - я считаю, что это приводит к более читабельному коду, а также вы можете ветвить код между этими фильтрами (чтобы добавить условия того, фильтруете ли вы или нет). Это может выглядеть примерно так (извинения, непроверенный код, но приветствую любые изменения, если я сделаю некоторые опечатки!):
IQueryable<Foo> foos = _dbContext.Foos;
foos = foos.Where(f => f.Bar == myBar);
if(!string.IsNullOrNothing(myBaz)){
foos = foos.Where(f => f.Baz == myBaz)
}
Таким образом, в этом коде набор Foo
объектов всегда фильтруется, когда их свойство Bar
равно myBar
, но вторая фильтрация применяется только тогда, когда myBar
равно , а не null и не ничего (обратите внимание на то, что !
делает это не так, что является одной из точек dotNet, и оба считают, что в вашем исходном коде отсутствует)
Теперь позвольте мне применить это к методу расширения, который вы пытаетесь создать. Сложность заключается в том, что существуют различные сопоставления, которые можно получить из OtherEntity
или ThirdEntity
и AgentEntity
, и мы хотим использовать Func<T, AgentEntity>
для определения этого сопоставления (обратите внимание, что мы сопоставляем из универсального типа 'T')
public static IQueryable<T> Where<T>(this IQueryable<T> profiles, Func<T, AgentEntity> mapping, AgentEntity agent)
{
if (!string.IsNullOrEmpty(agent.MBox))
{
profiles = profiles.Where(p => mapping(p).MBox == agent.MBox);
}
return profiles;
}
Обратите внимание, что мы используем переданную функцию отображения для преобразования каждого профиля в агента, который мы используем для фильтра. Он вызывается так же, как в вашем первоначальном вопросе:
_dbContext.OtherEntity.Where(x=> x.Agent, agent);
Также обратите внимание, что я не возвращаюсь до конца функции - это может или не может быть тем, что вы на самом деле хотите - вы можете захотеть вернуться, как только найдете один критерий, по которому вы можете фильтровать!
Надеюсь, что вы на правильном пути!