public void Parse() { Pieces.Clear(); var pathPieces = Path.Split('.').ToList(); var param = Parameter; ExpressionParserPiece parent = null; pathPieces.ForEach(pp => { var memberExpression = Expression.PropertyOrField(param, pp); var current = new ExpressionParserPiece { Type = memberExpression.Type, IsGenericEnumerable = QueryableHelpers.IsGenericEnumerable(memberExpression), EnumerableType = memberExpression.Type.GenericTypeArguments.FirstOrDefault(), Parent = parent, Name = pp }; Pieces.Add(current); // for next iteration. param = Expression.Parameter(current.IsGenericEnumerable ? current.EnumerableType : current.Type); parent = current; }); }
public static ExpressionParserPiece GetFirstEnumerableParent(ExpressionParserPiece piece) { if (piece.Parent == null) { return(null); } if (piece.Parent.IsGenericEnumerable) { return(piece.Parent); } return(GetFirstEnumerableParent(piece.Parent)); }
public static ExpressionParserPiece FirstEnumerableParent(this ExpressionParserPiece piece) { var result = ExpressionParser.GetFirstEnumerableParent(piece); return(result); }