public IndexDesigner <TIndex, TEntity> With <TMember>(Expression <Func <TIndex, TMember> > namer, Expression <Func <TEntity, TMember> > projector, params Option[] options) { var name = ColumnNameBuilder.GetColumnNameByConventionFor(namer); designer.With(name, projector, options); return(this); }
protected virtual void VisitColumnMethodCall(MethodCallExpression expression) { switch (expression.Method.Name) { case "Column": { var column = ast.Pop() as SqlColumnExpression; // remove the current column expression if (column == null || column.ColumnName != "") { throw new NotSupportedException( string.Format("{0} method must be called on the lambda parameter.", expression)); } var constant = (SqlConstantExpression)ast.Pop(); var columnType = expression.Method.GetGenericArguments()[0]; var columnName = (string)constant.Value; ast.Push(new SqlColumnExpression(columnType, columnName)); break; } case "Index": { var column = ast.Pop() as SqlColumnExpression; // remove the current column expression if (column == null || column.ColumnName != "") { throw new NotSupportedException( string.Format("{0} method must be called on the lambda parameter.", expression)); } var type = expression.Method.GetGenericArguments()[0]; ast.Push(new SqlColumnPrefixExpression(type.Name)); break; } default: ast.Pop(); var name = ColumnNameBuilder.GetColumnNameByConventionFor(expression); ast.Push(new SqlColumnExpression(expression.Method.ReturnType, name)); break; } }
protected override Expression VisitMember(MemberExpression expression) { if (expression.Expression == null) { ast.Push(new SqlConstantExpression(expression.Member.GetMemberType(), expression.Member.GetValue(null))); return(expression); } Visit(expression.Expression); switch (ast.Peek().NodeType) { case SqlNodeType.Constant: var constant = (SqlConstantExpression)ast.Pop(); if (constant.Value == null) { throw new NullReferenceException(); } ast.Push(new SqlConstantExpression(expression.Member.GetMemberType(), expression.Member.GetValue(constant.Value))); break; case SqlNodeType.ColumnPrefix: //TODO: clean up this mess. var prefix = (SqlColumnPrefixExpression)ast.Pop(); ast.Push(new SqlColumnExpression(expression.Member.GetMemberType(), expression.Member.Name)); break; case SqlNodeType.Column: ast.Pop(); var name = ColumnNameBuilder.GetColumnNameByConventionFor(expression); ast.Push(new SqlColumnExpression(expression.Member.GetMemberType(), name)); break; default: throw new ArgumentOutOfRangeException(); } return(expression); }
public DocumentDesigner <TEntity> With <TMember>(Expression <Func <TEntity, TMember> > projector, params Option[] options) { return(With(ColumnNameBuilder.GetColumnNameByConventionFor(projector), projector, options)); }