我想讓用戶選擇通過不同的屬性進行搜索。例如使用反射從屬性中獲取lambda表達式名稱
[輸入文字] | [選擇選項{ID,姓名,電話}] | [檢索]
我後來建立我的查詢是這樣的:
repository.Where(lambda-expression)
其中λ-表達是從所選擇的選項{ID,姓名,電話}建立 (例如:X => X .NAME.Equals(INPUT TEXT))
有沒有辦法從屬性名稱中使用反射來構建lambda?
感謝
我想讓用戶選擇通過不同的屬性進行搜索。例如使用反射從屬性中獲取lambda表達式名稱
[輸入文字] | [選擇選項{ID,姓名,電話}] | [檢索]
我後來建立我的查詢是這樣的:
repository.Where(lambda-expression)
其中λ-表達是從所選擇的選項{ID,姓名,電話}建立 (例如:X => X .NAME.Equals(INPUT TEXT))
有沒有辦法從屬性名稱中使用反射來構建lambda?
感謝
你不建立一個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
對於那種薄克,我用的是這樣的(注:做了其中的「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);
}
我不得不面對同一類問題,下面的方法解決完美我的問題。
PropertyInfo propertyInfoObj = MyClassObject.GetType().GetProperty(PropertyName);
repository.Where(x => propertyInfoObj.GetValue(x) == SearchValue).Select(x => propertyInfoObj.GetValue(x)).FirstOrDefault();
感謝,它的工作就像一個魅力......我起初得到一個錯誤,我不得不改變我的類型從IEnumerable到IQueryable,但我應該一直使用IQueryable開始。 – AJC
@AJC:你可以使該方法成爲一種通用方法,並將其作爲類型參數?或者只是將該類型作爲正常參數。由於您沒有提供很多背景知識,因此很難知道要提出建議。 –
是的,對不起,我有一點懶惰了一秒鐘。我將通過類型作爲參數...謝謝... – AJC