Не уверен, в чем проблема с использованием построителя предикатов - это не обязательно должен быть пакет LINQ Kit, так называемый построитель предикатов обычно представляет собой один статический класс с двумя методами расширения - как Универсальный построитель предикатов или мой собственный PredicateUtils
из Установить связь между двумя списками в linq для сущностей, в которых есть пункт и подобные.
В любом случае, если вы захотите, конечно, его можно построить с помощью простых выражений статических методов класса.
Добавьте следующее, чтобы избежать необходимости писать Expression.
перед каждым вызовом:
using static System.Linq.Expressions.Expression;
и затем используйте что-то вроде этого:
if (conditions.Any())
{
var parameter = Parameter(typeof(History));
var body = conditions
.Select(condition => Expression.Constant(condition))
.Select(condition => Expression.AndAlso(
Expression.Equal(
Expression.PropertyOrField(parameter, nameof(History.IdReference)),
Expression.Convert(
Expression.PropertyOrField(condition, nameof(Condition.IdReference))
, Expression.PropertyOrField(parameter, nameof(History.IdReference)).Type)
),
Expression.Equal(
Expression.PropertyOrField(parameter, nameof(History.TableName)),
Expression.Convert(
Expression.PropertyOrField(condition, nameof(Condition.TableName))
, Expression.PropertyOrField(parameter, nameof(History.TableName)).Type)
)
))
.Aggregate(Expression.OrElse);
var predicate = Lambda<Func<History, bool>>(body, parameter);
histories = histories.Where(predicate);
}