У меня есть сценарий, когда я динамически создаю предложение WHERE из конфигурации сетки на клиентской стороне. Клиент отправляет json на сервер, который затем обрабатываю и затем преобразует в выражение, чтобы он мог быть передан в репозиторий в качестве предложения where.Выражение для свойства сложного типа
На данный момент я борюсь с созданием выражения для сложных типов собственности, как этот:
public partial class Resource
{
public string DisplayName { get; set; }
public virtual ResourceType ResourceType { get; set; }
}
ниже код, который делает перевод на выражение хорошо работает для простых типов, таких как свойства DisplayName. Выражение будет что-то вроде:
x => x.DisplayName == "ValueEnteredByUserInTheUI"
Однако, когда значение вводится в сетке для свойства ResourceType, выражение в конечном счете будет что-то вроде:
x => x.ResourceType == "ValueEnteredByUserInTheUI"
я пропускаю один шаг для преобразования в это:
x => x.ResourceType.Name == "ValueEnteredByuserInTheUI"
Любой может указать мне в правильном направлении здесь?
public Expression<Func<T, bool>> GetExpression<TEntity>(string field, string operation, object value, string ignoreCase)
{
Expression<Func<T, bool>> whereClause = default(Expression<Func<T, bool>>);
// Define lambda
ParameterExpression param = Expression.Parameter(typeof(T), "x");
MemberExpression member = Expression.Property(param, field);
// Get property type
Type propertyType = member.Type;
// Get converter for type
TypeConverter converter = TypeDescriptor.GetConverter(propertyType);
// Convert property to type
var result = converter.ConvertFrom(value.ToString());
// Convert value to constant value
ConstantExpression constant = Expression.Constant(result);
Expression comparingExpression = default(BinaryExpression);
switch (operation)
{
case "like":
comparingExpression = Expression.Equal(member, Expression.Convert(constant, member.Type));
break;
default:
break;
}
var lambda = Expression.Lambda<Func<T, bool>>(comparingExpression, param);
whereClause = whereClause == default(Expression<Func<T, bool>>) ? lambda : NewPredicateBuilder.And(whereClause, lambda);
return whereClause;
}
Это не место, где кто-то сделает за вас работу. Есть ряд таких вопросов с ответами. Например [здесь] (http://stackoverflow.com/q/11167989/183267). – ieaglle
Вы правы, неправильный выбор слов здесь. Я изменил вопрос. – hbulens