private static IEnumerable <MemberExpression> MapProperty(ModelPropertyInfo argumentProperty, WhereBuilderContext context) { var info = context.ElementModel; List <string> names = new List <string>(5); List <ModelPropertyInfo> chain = new List <ModelPropertyInfo>(5); names.AddRange(argumentProperty.Maps.Where(o => o.SourceType == info.ModelType).Select(o => o.PropertyName)); if (names.Count == 0) { names.Add(argumentProperty.Name); } foreach (string name in names.Distinct()) { chain.Clear(); ModelConvert.FillPropertyChain(info, name, chain); Debug.Assert(chain.Count > 0); MemberExpression member = null; foreach (var mp in chain) { member = Expression.MakeMemberAccess((Expression)member ?? context.Parameter, mp.PropertyInfo); } yield return(member); } }
private static Tuple <Sort, LambdaExpression> ParseSort(Sort sort, ModelInfo model) { List <ModelPropertyInfo> chain = new List <ModelPropertyInfo>(3); ModelConvert.FillPropertyChain(model, sort.PropertyName, chain); ParameterExpression parameter = Expression.Parameter(model.ModelType, "obj"); MemberExpression member = null; foreach (var mp in chain) { member = Expression.MakeMemberAccess((Expression)member ?? parameter, mp.PropertyInfo); } return(Tuple.Create(sort, Expression.Lambda(typeof(Func <,>).MakeGenericType(model.ModelType, member.Type), member, parameter))); }