Как и рекомендовал @Yuriy Faktorovich, динамический LINQ может быть вашим лучшим выстрелом.
Другой вариант , который у вас есть, - это динамическое построение деревьев выражений и выполнить свое выражение с помощью отражения.Имейте в виду, что это нелегко и может занять немного времени, чтобы обернуть голову вокруг API выражения, но для простого выражения это не так уж плохо.
Пример: скажем, вы хотите повторить это выражение:
p => p.FirstName == firstName
Вы можете построить дерево выражений следующим образом:
var myType = Type.GetType("Person"); // <-- Find your type based on XML
var firstName = "John";
var param = Expression.Parameter(myType, "p");
var firstNameProperty = Expression.Property(param, "FirstName");
var constantExpression = Expression.Constant(firstName);
var equalsExpression = Expression.Equal(firstNameProperty, constantExpression);
var lambda = Expression.Lambda(equalsExpression, param);
Лямбда будет иметь тип времени выполнения Expression<Func<Person,bool>>
, который затем можно будет передать любой реализации IQueryable
.
ОБНОВЛЕНИЕ
Затем для динамического вызова некоторого метода на вашем IQueryable
вы можете сделать что-то похожее на следующее:
var queryableType = typeof(Queryable);
var whereMethod = queryableType.GetMethod("Where", BindingFlags.Public | BindingFlags.Static);
var parameters = new object[] { query, lambda }; // query is your IQueryable object
var list = whereMethod.Invoke(null, parameters);