標籤:opera rem exce stat 實值型別 資料 field 必須 info
/// <summary>
/// 擷取查詢運算式樹 (zuowenjun.cn)
/// </summary>
/// <typeparam name="TEntity"></typeparam>
/// <param name="fieldName"></param>
/// <param name="operatorName"></param>
/// <param name="value"></param>
/// <param name="value2"></param>
/// <returns></returns>
public
static
Expression<Func<TEntity,
bool
>> GetQueryExpression<TEntity>(
string
fieldName,
string
operatorName,
string
value,
string
value2)
where
TEntity :
class
{
PropertyInfo fieldInfo =
typeof
(TEntity).GetProperty(fieldName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.IgnoreCase);
Type pType = fieldInfo.PropertyType;
if
(
string
.IsNullOrEmpty(operatorName))
{
throw
new
ArgumentException(
"運算子不可為空!"
,
"operatorName"
);
}
dynamic convertedValue;
if
(!value.TryChangeType(pType,
out
convertedValue))
{
throw
new
ArgumentException(
string
.Format(
"【{0}】的查詢實值型別不正確,必須為{1}類型!"
, General.GetDisplayName(fieldInfo), pType.FullName),
"value"
);
}
ParameterExpression expParameter = Expression.Parameter(
typeof
(TEntity),
"f"
);
MemberExpression expl = Expression.Property(expParameter, fieldInfo);
ConstantExpression expr = Expression.Constant(convertedValue, pType);
Expression expBody =
null
;
Type expType =
typeof
(Expression);
var
expMethod = expType.GetMethod(operatorName,
new
[] { expType, expType });
if
(expMethod !=
null
)
{
expBody = (Expression)expMethod.Invoke(
null
,
new
object
[] { expl, expr });
}
else
if
(FilterOperators.Between == operatorName)
{
dynamic convertedValue2;
if
(!value2.TryChangeType(pType,
out
convertedValue2))
{
throw
new
ArgumentException(
string
.Format(
"【{0}】的查詢值2類型不正確,必須為{1}類型!"
, General.GetDisplayName(fieldInfo), pType.FullName),
"value"
);
}
ConstantExpression expr2 = Expression.Constant(convertedValue2, pType);
expBody = Expression.GreaterThanOrEqual(expl, expr);
expBody = Expression.AndAlso(expBody, Expression.LessThanOrEqual(expl, expr2));
}
else
if
(
new
[] { FilterOperators.Contains, FilterOperators.StartsWith, FilterOperators.EndsWith }.Contains(operatorName))
{
expBody = Expression.Call(expl,
typeof
(
string
).GetMethod(operatorName,
new
Type[] {
typeof
(
string
) }), expr);
}
else
{
throw
new
ArgumentException(
"無效的運算子!"
,
"operatorName"
);
}
Expression<Func<TEntity,
bool
>> lamExp = Expression.Lambda<Func<TEntity,
bool
>>(expBody, expParameter);
return
lamExp;
}
C#實現通用資料過濾表單