Есть несколько способов сделать это.В этом конкретном случае вам даже не нужно иметь дело с выражениями, потому что вы можете использовать просто цепочку Where
после Select
(условия Where
в цепочке объединяются с &&
в конечном запросе):
var query = db.myTables
.Where(x => x.companyId == 1)
.Select((Expression<Func<myTable, string>>)selector)
.Where(v => targetCodes.Contains(v));
Но чтобы ответить на ваш вопрос, как построить выражение, представляющее targetCodes.Contains({field})
, так как фактический вызов (без сахара метода расширения) вам нужен Enumerable.Contains<string>(targetCodes, {field})
, самое простое -используйте следующую Expression.Call
перегрузку метода, специально предусмотренную для «вызова» статических (обобщенных и неуниверсальных) методов:
public static MethodCallExpression Call(
Type type,
string methodName,
Type[] typeArguments,
params Expression[] arguments
);
В вашем случае это можно использовать так:
var containsCall = Expression.Call(
typeof(Enumerable), nameof(Enumerable.Contains), new [] { typeof(string) },
Expression.Constant(targetCodes), field);