private object ExecDataSource(DSW dsWrapper) { if (dsWrapper.DataSource.Type == DataSourceType.CODE) { Dictionary <string, object> arguments = new Dictionary <string, object>(); if (dsWrapper.DataSource.Parameters != null) { foreach (var par in dsWrapper.DataSource.Parameters) { var pageDSParam = dsWrapper.PageDataSource.Parameters.SingleOrDefault(x => x.Name == par.Name); string value = par.Value; if (pageDSParam != null) { value = ProcessParameterValue(pageDSParam.Value); if (string.IsNullOrWhiteSpace(value)) { value = ProcessParameterValue(par.Value); value = CheckProcessDefaultValue(value); var ds = dsMan.Get(dsWrapper.PageDataSource.DataSourceId); var dsParam = ds.Parameters.SingleOrDefault(x => x.Name == par.Name); if (dsParam != null) { arguments[dsParam.Name] = dsMan.GetDataSourceParameterValue(new DataSourceParameter { Name = dsParam.Name, Type = dsParam.Type, Value = value }); } else { arguments[par.Name] = value; } } else { value = CheckProcessDefaultValue(value); arguments[pageDSParam.Name] = dsMan.GetDataSourceParameterValue(new DataSourceParameter { Name = pageDSParam.Name, Type = pageDSParam.Type, Value = value }); } } else { value = ProcessParameterValue(value); value = CheckProcessDefaultValue(value); var ds = dsMan.Get(dsWrapper.PageDataSource.DataSourceId); var dsParam = ds.Parameters.SingleOrDefault(x => x.Name == par.Name); if (dsParam != null) { arguments[dsParam.Name] = dsMan.GetDataSourceParameterValue(new DataSourceParameter { Name = dsParam.Name, Type = dsParam.Type, Value = value }); } else { arguments[par.Name] = value; } } } } arguments["PageModel"] = this; var codeDS = (CodeDataSource)dsWrapper.DataSource; return(codeDS.Execute(arguments)); } else if (dsWrapper.DataSource.Type == DataSourceType.DATABASE) { var eqlParameters = new List <EqlParameter>(); if (dsWrapper.DataSource.Parameters != null) { foreach (var par in dsWrapper.DataSource.Parameters) { var pageDSParam = dsWrapper.PageDataSource.Parameters.SingleOrDefault(x => x.Name == par.Name); string value = par.Value; if (pageDSParam != null) { value = ProcessParameterValue(pageDSParam.Value); if (string.IsNullOrWhiteSpace(value)) { value = ProcessParameterValue(par.Value); value = CheckProcessDefaultValue(value); var ds = dsMan.Get(dsWrapper.PageDataSource.DataSourceId); var dsParam = ds.Parameters.SingleOrDefault(x => x.Name == par.Name); if (dsParam != null) { eqlParameters.Add(dsMan.ConvertDataSourceParameterToEqlParameter(new DataSourceParameter { Name = dsParam.Name, Type = dsParam.Type, Value = value })); } else { eqlParameters.Add(new EqlParameter(par.Name, value)); } } else { value = CheckProcessDefaultValue(value); eqlParameters.Add(dsMan.ConvertDataSourceParameterToEqlParameter(new DataSourceParameter { Name = pageDSParam.Name, Type = pageDSParam.Type, Value = value })); } } else { value = ProcessParameterValue(value); value = CheckProcessDefaultValue(value); var ds = dsMan.Get(dsWrapper.PageDataSource.DataSourceId); var dsParam = ds.Parameters.SingleOrDefault(x => x.Name == par.Name); if (dsParam != null) { eqlParameters.Add(dsMan.ConvertDataSourceParameterToEqlParameter(new DataSourceParameter { Name = dsParam.Name, Type = dsParam.Type, Value = value })); } else { eqlParameters.Add(new EqlParameter(par.Name, value)); } } } } DatabaseDataSource dbDs = (DatabaseDataSource)dsWrapper.DataSource; return(dsMan.Execute(dbDs.Id, eqlParameters)); } else { throw new Exception("Not supported data source type."); } }
public object GetProperty(string propName) { //Stopwatch sw = new Stopwatch(); //sw.Start(); //try //{ if (string.IsNullOrWhiteSpace(propName)) { throw new ArgumentException(nameof(propName)); } //replace keyword $index with 0 var name = propName.Replace("$index", "0"); string[] tmpPropChain = name.Split(".", StringSplitOptions.RemoveEmptyEntries); List <string> completePropChain = new List <string>(); foreach (var pName in tmpPropChain) { var indexerIdx = pName.IndexOf("["); if (indexerIdx != -1) { var n = pName.Substring(0, indexerIdx); var idx = pName.Substring(indexerIdx, pName.Length - indexerIdx); completePropChain.Add(n); completePropChain.Add(idx); } else { completePropChain.Add(pName); } } MPW mpw = null; var currentPropDict = Properties; var currentPropertyNamePath = string.Empty; string parentPropName = string.Empty; foreach (var ppName in completePropChain) { var pName = ppName; if (string.IsNullOrWhiteSpace(currentPropertyNamePath)) { currentPropertyNamePath = pName; } else { currentPropertyNamePath += $".{pName}"; } //try to get property with full key (after http post object are entered with no . split if (parentPropName == "Record") { var testName = propName.Substring(7); //cut the Record. in front if (pName != testName && currentPropDict.ContainsKey(testName)) { return(currentPropDict[testName].Value); } } //try to get property with full key (after http post object are entered with no . split if (parentPropName == "RelatedRecord") { var testName = propName.Substring(14); //cut the RelatedRecord. in front if (pName != testName && currentPropDict.ContainsKey(testName)) { return(currentPropDict[testName].Value); } } if (!currentPropDict.ContainsKey(pName)) { if (!currentPropertyNamePath.EndsWith("]")) { throw new PropertyDoesNotExistException($"Property name '{currentPropertyNamePath}' not found."); } else { throw new PropertyDoesNotExistException($"Property name is found, but list index is out of bounds."); } } mpw = currentPropDict[pName]; if (mpw != null && mpw.Type == MPT.DataSource) { DSW dsw = mpw.Value as DSW; if (dsw != null) { var result = ExecDataSource(dsw); if (result is List <EntityRecord> || result is EntityRecordList) { mpw = new MPW(MPT.ListEntityRecords, result); currentPropDict[pName] = mpw; } else if (result is EntityRecord) { mpw = new MPW(MPT.EntityRecord, result); currentPropDict[pName] = mpw; } else { mpw = new MPW(MPT.Object, result); currentPropDict[pName] = mpw; } } } currentPropDict = mpw.Properties; parentPropName = ppName; } return(mpw.Value); //} //finally { // Debug.WriteLine(">>>>>>>>>> " + propName + " >> " + sw.ElapsedMilliseconds); //} }