2015-09-30 2 views
0

У меня есть сценарий, когда я динамически создаю предложение 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; 
    } 
+2

Это не место, где кто-то сделает за вас работу. Есть ряд таких вопросов с ответами. Например [здесь] (http://stackoverflow.com/q/11167989/183267). – ieaglle

+0

Вы правы, неправильный выбор слов здесь. Я изменил вопрос. – hbulens

ответ

1

По-видимому, не многие люди увлекаются выражениями. Во всяком случае, я создал обходной путь для этой проблемы. Я добавил еще один параметр в метод, указывающий имя свойства сложного свойства корневого объекта.

// Get property of root object 
MemberExpression member = Expression.Property(param, field); 

// Get property of property 
MemberExpression memberField = Expression.PropertyOrField(member, complexProperty); 

Это не очень масштабируемое и не общее, но это сделает это пока.

Смежные вопросы