Что вам нужно сделать, это сломать исходное IQueryable
, извлечь источник и выражение запроса, а затем создать новое выражение запроса, а затем новый IQueryable из источника и нового выражения запроса. Если нет Where
, просто добавьте условие к исходному запросу.
IQueryable<T> q = _context.Set<T>().Where(x => x.Id == 1);
if(someValue) {
Expression<Func<T,bool>> newWhereClause = (T x) => x.Status == 1;
Expression source;
if (q.Expression is MethodCallExpression qe && qe.Method.Name == "Where") {
var we = (MethodCallExpression)q.Expression; // get the call to Where
var wea1 = (UnaryExpression)we.Arguments[1]; // get the 2nd arg to Where (Quoted Lambda)
var leftExpr = (Expression<Func<T, bool>>)wea1.Operand; // Extract the lambda from the QuoteExpression
newWhereClause = ExpressionBuilder.Or(leftExpr, newWhereClause);
q = q.Provider.CreateQuery<T>(we.Arguments[0]).Where(newWhereClause);
}
else
q = q.Where(newWhereClause);
}
Обратите внимание, что это зависит от внутренних элементов LINQ и деревьев выражений и может сломаться в какой-то момент в будущем.