/// <summary> /// 从远程获取对象实例。 /// </summary> /// <param name="parameter">获取前检索用的参数信息。</param> /// <param name="targetType">需要获取的最终类型。</param> /// <returns>符合条件的实例对象。</returns> public object GetObject(RemoteDataParameter parameter, Type targetType) { var uri = parameter.BuildUri(); var method = "GetByOData"; if (parameter.Executor == "Count" || parameter.Executor == "LongCount") { method = "CountByOData"; } else if (parameter.Executor == "Any") { method = "AnyByOData"; } var absoluteUrl = string.Format("{0}#{1}", Client.BaseAddress, method); if (parameter.Executor == "First" || parameter.Executor == "FirstOrDefault") { targetType = typeof(IQueryable <>).MakeGenericType(targetType); } var result = Client.GetAsync(method).FetchValue(targetType, "GET", absoluteUrl); if (parameter.Executor == "First" || parameter.Executor == "FirstOrDefault") { return((result as IEnumerable).OfType <object>().FirstOrDefault()); } return(result); }
/// <summary> /// Creates an array of Database compatible parameters from the provided array of parameters /// </summary> /// <param name="inputParams">the parameters that were provided by the client</param> /// <param name="connection">the connection that can be used to re-create parameters that were lost</param> /// <returns>an array of parameters that is compatible to the underlaying database connection</returns> private IDbDataParameter[] BuildParameters(IDbDataParameter[] inputParams, IDbWrapper connection) { IDbDataParameter[] retVal = null; if (parameters != null) { retVal = new IDbDataParameter[inputParams.Length]; for (int i = 0; i < inputParams.Length; i++) { RemoteDataParameter param = inputParams[i] as RemoteDataParameter; if (param == null) { throw new InvalidOperationException( "Need to provide Parameters that were created by the connection!"); } lock (this.parameters) { IDbDataParameter dbParam; if (this.parameters.ContainsKey(param.ObjectId)) { dbParam = this.parameters[param.ObjectId]; } else { dbParam = connection.GetParameter(param.ParameterName, param.Value); } param.ApplyTo(dbParam); retVal[i] = dbParam; } } } return(retVal); }
public object Execute(Expression expression) { var dataParameter = new RemoteDataParameter(); var methodCallExpression = expression as MethodCallExpression; dataParameter.Executor = methodCallExpression.Method.Name; var processor = RemoteObjectContext.DefaultObjectResolver.GetInstance <IExpressionProcessor>(); processor.DataParameter = dataParameter; processor.Writer = RemoteObjectContext.DefaultObjectResolver.GetInstance <IExpressionWriter>(); processor.Build(methodCallExpression); return(DataFetcher.GetObject(dataParameter, methodCallExpression.Method.ReturnType)); }
private string ReplenishURL(IMethodCallMessage methodCall) { var data = new List <string>(); var parameters = methodCall.MethodBase.GetParameters(); for (int i = 0; i < methodCall.ArgCount; i++) { var argName = methodCall.GetInArgName(i); var arg = methodCall.GetInArg(i); var parameter = parameters.First(p => p.Name == argName); var binding = parameter.GetCustomAttribute <ParameterBindingAttribute>(); if (binding == null) { continue; } if (binding.BindingType == "Uri") { data.Add(string.Format("{0}={1}", argName, Uri.EscapeUriString(ReferenceEquals(arg, null) ? "null" : arg.ToString()))); } else if (binding.BindingType == "ODataParameter" && !ReferenceEquals(arg, null)) { var dataParameter = new RemoteDataParameter(); var processor = RemoteObjectContext.DefaultObjectResolver.GetInstance <IExpressionProcessor>(); processor.Writer = RemoteObjectContext.DefaultObjectResolver.GetInstance <IExpressionWriter>(); processor.DataParameter = dataParameter; processor.Build((arg as LambdaExpression).Body as MethodCallExpression); data.Add(dataParameter.BuildUri()); } } return(string.Join("&", data)); }