2011-08-30 162 views
4

我想讓用戶選擇通過不同的屬性進行搜索。例如使用反射從屬性中獲取lambda表達式名稱

[輸入文字] | [選擇選項{ID,姓名,電話}] | [檢索]

我後來建立我的查詢是這樣的:

repository.Where(lambda-expression) 

其中λ-表達是從所選擇的選項{ID,姓名,電話}建立 (例如:X => X .NAME.Equals(INPUT TEXT))

有沒有辦法從屬性名稱中使用反射來構建lambda?

感謝

回答

20

你不建立一個lambda表達式 - 您構建表達式樹。這並不難,但需要一點耐心。在您的樣品你可能需要:

ParameterExpression parameter = Expression.Parameter(typeof(Foo), "x"); 
Expression property = Expression.Property(parameter, propertyName); 
Expression target = Expression.Constant(inputText); 
Expression equalsMethod = Expression.Call(property, "Equals", null, target); 
Expression<Func<Foo, bool>> lambda = 
    Expression.Lambda<Func<Foo, bool>>(equalsMethod, parameter); 

這是假設:

  • 信息庫元素類型是Foo
  • 你想使用一個名爲屬性propertyName
  • 你想比較平等針對inputText
+0

感謝,它的工作就像一個魅力......我起初得到一個錯誤,我不得不改變我的類型從IEnumerable到IQueryable,但我應該一直使用IQueryable開始。 – AJC

+0

@AJC:你可以使該方法成爲一種通用方法,並將其作爲類型參數?或者只是將該類型作爲正常參數。由於您沒有提供很多背景知識,因此很難知道要提出建議。 –

+0

是的,對不起,我有一點懶惰了一秒鐘。我將通過類型作爲參數...謝謝... – AJC

2

對於那種薄克,我用的是這樣的(注:做了其中的「Like」):

public static IQueryable<TEntity> Where<TEntity>(this IQueryable<TEntity> source, string propertyName, string value) 
    { 

     Expression<Func<TEntity, bool>> whereExpression = x => x.GetType().InvokeMember(propertyName, BindingFlags.GetProperty, null, x, null).ObjectToString().IndexOf(value, StringComparison.InvariantCultureIgnoreCase) >= 0; 

     return source.Where(whereExpression); 


    } 
1

我不得不面對同一類問題,下面的方法解決完美我的問題。

PropertyInfo propertyInfoObj = MyClassObject.GetType().GetProperty(PropertyName); 
repository.Where(x => propertyInfoObj.GetValue(x) == SearchValue).Select(x => propertyInfoObj.GetValue(x)).FirstOrDefault(); 
相關問題