using System; using System.Linq.Expressions; namespace Vit.Linq.QueryBuilder { public partial class LinqHelp { public static MemberExpression GetFieldMemberExpression_ByName(Expression parameter, string propertyOrFieldName) { return Expression.PropertyOrField(parameter, propertyOrFieldName); } /// /// /// /// /// could be nasted , example: "name" "depart.name" /// public static MemberExpression GetFieldMemberExpression(ParameterExpression parameter, string fieldPath) { MemberExpression memberExp = null; foreach (var fieldName in fieldPath?.Split('.')) { memberExp = GetFieldMemberExpression_ByName(((Expression)memberExp) ?? parameter, fieldName); } return memberExp; } /// /// /// /// /// could be nasted , example: "name" "depart.name" /// public static MemberExpression GetFieldMemberExpression(Type type, string fieldPath) { return GetFieldMemberExpression(Expression.Parameter(type), fieldPath); } public static Expression> GetFieldExpression(string fieldPath) { var parammeter = Expression.Parameter(typeof(T)); MemberExpression memberExp = GetFieldMemberExpression(parammeter, fieldPath); var lambda = Expression.Lambda(memberExp, parammeter).Compile(); return t => lambda.DynamicInvoke(t); } } }