public static DIC_MyFirstDictionaryFilter CreateDefault(MainPageUrlBuilder url, DBDataContext db, bool showHistory, List <MainPageUrlBuilder.FilterParameter> controlFilterParameters) { var filter = new DIC_MyFirstDictionaryFilter(); var newUrl = url != null?url.Clone() : new MainPageUrlBuilder(); newUrl.ShowHistory = showHistory; newUrl.SelectMode = "none"; newUrl.ViewMode = "none"; foreach (var item in controlFilterParameters) { newUrl.ControlFilterParameters.Add(item.Clone()); } filter.SetUrl(newUrl); filter.SetDB(db); filter.ShowHistory = showHistory; return(filter); }
private static void Export(HttpContext context, string queryParameters, IDataSourceView4 dataSourceView, IExportJournal journal, ICollection <string> selectedValues) { if (!dataSourceView.CheckPermit() || !dataSourceView.CheckPermitExport()) { context.Response.StatusCode = 404; context.Response.End(); return; } var data = selectedValues != null && selectedValues.Count > 0 ? dataSourceView.GetSelectIRowByID(queryParameters, selectedValues.ToArray()) : dataSourceView.GetSelectIRow(queryParameters); var log = InitializerSection.GetSection().LogMonitor; log.Init(); var exportData = data.ToList(); journal.Url = new MainPageUrlBuilder("/MainPage.aspx/data/" + journal.TableName + "Journal" + queryParameters); journal.PrepareExportData(exportData); var args = new JournalExportEventArgs { CheckPermit = true, Columns = GridHtmlGenerator.GetColumnsForExport(journal.GetColumns()), FilterValues = journal.GetFilterValues(), Format = "Excel", Header = journal.TableHeader, LogMonitor = log, Control = new AccessControl(dataSourceView.CheckPermitExport), Data = exportData, }; var url = new MainPageUrlBuilder { UserControl = journal.TableName + "Journal", IsDataControl = true, ShowHistory = true, }; args.ViewJournalUrl = new StringBuilder(); url.CreateUrl(args.ViewJournalUrl); args.ViewJournalUrl.Append("?id.EqualsCollection="); var stream = WebSpecificInstances.GetExcelExporter().GetExcelStream(args); PageHelper.DownloadFile(stream, journal.TableHeader + "." + args.FileNameExtention, context.Response); }
public static object Execute(Page page, MainPageUrlBuilder url, string functionClassName) { if (functionClassName != null) { var functionClassType = BuildManager.GetType(functionClassName, false, true); if (functionClassType != null) { var function = (QueryBuilder)Activator.CreateInstance(functionClassType); if (page == null) { using (page = new Page()) return(function.Execute(url, page)); } return(function.Execute(url, page)); } } return(null); }
/// <summary> /// Получить вырожение для фильтрации данных по текущей ссылке. /// </summary> /// <param name="url">Текущая ссылка.</param> /// <param name="exp">Вырожение предоставляющее объект строки, типа таблицы навигатора.</param> /// <param name="referenceKey">Ключ ссылки в строке браузера.</param> /// <returns>Возвращет вырожение в виде результата boolean, если нет необходимости в фильтрации, то возвращается null.</returns> public virtual Expression FilterData(MainPageUrlBuilder url, Expression exp, string referenceKey) { var value = GetKeyValue(url.QueryParameters, referenceKey, false); if (string.IsNullOrEmpty(value)) { return(null); } var key = (long)DataSourceViewGetName.GetKey(value); if (QueryParameters == null) { return(Expression.Equal(Expression.Property(exp, "id"), Expression.Constant(key))); } var parameterKey = string.IsNullOrEmpty(referenceKey) ? TableNameKey : referenceKey + ".id.Equals"; return(Expression.Equal(Expression.Property(exp, "id"), QueryParameters.GetExpression(parameterKey, key))); }
protected bool SetUserControl(MainPageUrlBuilder urlBuilder) { if (string.IsNullOrEmpty(TableName)) { return(false); } urlBuilder.IsRead = false; urlBuilder.IsNew = false; urlBuilder.IsSelect = false; urlBuilder.IsFilterWindow = false; switch (DefaultDestination) { case MenuDefaultDestination.Journal: urlBuilder.UserControl = TableName + "Journal"; break; case MenuDefaultDestination.Read: if (Menu.BaseNavigatorControl.BaseNavigatorValues.ContainsKey(TableType)) { urlBuilder.UserControl = TableName + "Edit"; urlBuilder.IsRead = true; } else { urlBuilder.UserControl = TableName + "Journal"; } break; case MenuDefaultDestination.Edit: if (Menu.BaseNavigatorControl.BaseNavigatorValues.ContainsKey(TableType)) { urlBuilder.UserControl = TableName + "Edit"; } else { urlBuilder.UserControl = TableName + "Journal"; } break; default: throw new ArgumentOutOfRangeException(); } return(true); }
public static void ChangeUrlToParent(MainPageUrlBuilder url, string referenceName, string toTableName) { referenceName += "."; var changeKeys = url.QueryParameters.Where(r => r.Key.StartsWith(referenceName)).ToList(); foreach (var parameter in changeKeys) { url.QueryParameters.Remove(parameter.Key); var newKey = parameter.Key.Remove(0, referenceName.Length); if (newKey.Contains(".")) { url.QueryParameters[newKey] = parameter.Value; } else { url.QueryParameters["ref" + toTableName] = parameter.Value; } } }
/// <summary> /// Изменить наименования ссылок на родителей, режется по переданной ссылке. /// </summary> /// <param name="urlClone"></param> /// <param name="referenceKey"></param> /// <returns></returns> protected internal IDictionary <string, string> MoveQueryParametersToUp(MainPageUrlBuilder urlClone, string referenceKey) { var oldParameters = urlClone.QueryParameters; var newParams = new Dictionary <string, string>(oldParameters.Count); if (referenceKey == "") { foreach (var param in oldParameters) { newParams[param.Key] = param.Value; } } else { var thisKey = referenceKey + ".id"; referenceKey += "."; var index = referenceKey.Length; foreach (var param in oldParameters) { if (thisKey.Equals(param.Key, StringComparison.OrdinalIgnoreCase)) { newParams[TableNameKey] = param.Value; } else if (param.Key.StartsWith(referenceKey)) { newParams[param.Key.Substring(index)] = param.Value; } else if (param.Key.Equals(TableNameKey)) { if (!newParams.ContainsKey(param.Key) && !string.IsNullOrEmpty(param.Value)) { newParams[param.Key] = param.Value; } } else if (!param.Key.Contains('.')) { newParams[param.Key] = param.Value; } } } urlClone.QueryParameters = newParams; return(oldParameters); }
public void RaisePostBackEvent(string eventArgument) { string component = GlobalObject.decodeURIComponent(eventArgument); Url.SetFilter(GetFilterTableName(), component); if (Url != MainPageUrlBuilder.Current) { MainPageUrlBuilder.Current.SetFilter(component, GetFilterTableName()); } MainPageUrlBuilder.ChangedUrl(); filterValues = MainPageUrlBuilder.GetFilterItemsDicByFilterContent(component); OnFilterApply(EventArgs.Empty); var updatePanel = ControlHelper.FindControl <UpdatePanel>(this); if (updatePanel != null) { updatePanel.Update(); } }
/// <summary> /// Изменяем урл приводя его к урлу родительского журнала. /// </summary> /// <param name="urlBuilder"></param> /// <param name="menuItem"></param> private static void MoveReferenceToParent(MainPageUrlBuilder urlBuilder, BaseMenuItem menuItem, BaseMenuItem parentItem) { if (string.IsNullOrEmpty(menuItem.ReferenceName)) { return; } var keys = urlBuilder.QueryParameters.Keys.Where(r => r.EndsWith(".id")).ToList(); if (keys.Count == 0) { return; } var newValues = new Dictionary <string, string>(); foreach (var key in keys) { if (key == menuItem.ReferenceName + ".id") { var value = urlBuilder.QueryParameters[key]; urlBuilder.QueryParameters.Remove(key); urlBuilder.QueryParameters["ref" + parentItem.TableName] = value; } else if (key.StartsWith(menuItem.ReferenceName)) { var value = urlBuilder.QueryParameters[key]; urlBuilder.QueryParameters.Remove(key); var newKey = key.Substring(menuItem.ReferenceName.Length + 1); newValues[newKey] = value; } else { urlBuilder.QueryParameters.Remove(key); } foreach (var newValue in newValues) { urlBuilder.QueryParameters[newValue.Key] = newValue.Value; } } }
protected string GetLookUrl(MainPageUrlBuilder urlClone) { urlClone.UserControl = TableName + "Edit"; urlClone.IsRead = true; return(urlClone.CreateUrl()); }
/// <summary> /// Получить ссылки на родительскую таблицу. /// </summary> /// <param name="writer"></param> /// <param name="url"></param> /// <param name="urlClone"></param> /// <param name="referenceKey"></param> /// <param name="navigatorControl"></param> /// <returns></returns> public bool GetNavigatorToParent(HtmlTextWriter writer, MainPageUrlBuilder url, MainPageUrlBuilder urlClone, string referenceKey, BaseNavigatorControl navigatorControl) { var args = GetVisibleArgs(url.QueryParameters, referenceKey, navigatorControl.BaseNavigatorValues); if (!args.VisibleLookButton && !args.VisibleLookButton) { return(false); } var value = GetKeyValue(url.QueryParameters, referenceKey, false); IDictionary <string, string> oldParameters; if (value != null && !string.IsNullOrEmpty(CustomNavigatorUserControl)) { var control = navigatorControl.NavigatorCustomControls[this]; control.SetValue(value); control.BaseNavigatorValues = navigatorControl.BaseNavigatorValues; oldParameters = MoveQueryParametersToUp(urlClone, referenceKey); control.LookUrl = GetLookUrl(urlClone); control.JournalUrl = GetJournalUrl(urlClone); urlClone.QueryParameters = oldParameters; //navigatorControl.AddControl(control); control.Initialize(); control.RenderControl(writer); return(true); } writer.AddAttribute(HtmlTextWriterAttribute.Class, "font13"); writer.RenderBeginTag(HtmlTextWriterTag.Span); writer.RenderBeginTag(HtmlTextWriterTag.B); writer.Write(HttpUtility.HtmlAttributeEncode(GetHeaderToParent(value))); string name; if (!string.IsNullOrEmpty(value) && (name = GetRowName(value)) != null) { writer.Write(": "); writer.RenderEndTag(); //B if (DisableHtmlAttributeEncode) { writer.Write(name); } else { writer.Write(HttpUtility.HtmlAttributeEncode(name)); } } else { writer.RenderEndTag(); //B args.VisibleLookButton = false; } writer.Write(" <b>></b>"); oldParameters = MoveQueryParametersToUp(urlClone, referenceKey); if (args.VisibleLookButton) { writer.Write(" "); writer.AddAttribute(HtmlTextWriterAttribute.Href, GetLookUrl(urlClone)); writer.RenderBeginTag(HtmlTextWriterTag.A); writer.Write(Resources.SView); writer.RenderEndTag(); if (args.VisibleToJournalButton) { writer.Write(" -"); } } if (args.VisibleToJournalButton) { writer.Write(" "); writer.AddAttribute(HtmlTextWriterAttribute.Href, GetJournalUrl(urlClone)); writer.RenderBeginTag(HtmlTextWriterTag.A); writer.Write(Resources.SToJournal); writer.RenderEndTag(); } urlClone.QueryParameters = oldParameters; writer.RenderEndTag(); //span return(true); }
public void SetToJournal(BaseJournalUserControl journal, bool skipFilters, bool skipNavigators) { journal.BaseJournal.GroupColumns.Clear(); journal.BaseJournal.GroupColumns.AddRange(Grouping); journal.StorageValues = StorageValues; journal.ValuesLoaded = true; if (!string.IsNullOrEmpty(PageUrl)) { if (!skipNavigators && !skipFilters) { journal.Url = new MainPageUrlBuilder(PageUrl); journal.Url.ReportPluginName = ReportPluginName; journal.Url.CheckUseSession(); if (journal.Url.UserControl.Equals(MainPageUrlBuilder.Current.UserControl)) { MainPageUrlBuilder.Current = journal.Url; MainPageUrlBuilder.ChangedUrl(); } } else { var url = journal.Url; var lUrl = new MainPageUrlBuilder(PageUrl); if (!skipNavigators) { foreach (var key in url.QueryParameters.Keys.ToList()) { if (key.Contains(".")) { url.QueryParameters.Remove(key); } } foreach (var queryParameter in lUrl.QueryParameters) { if (queryParameter.Key.Contains(".")) { url.QueryParameters[queryParameter.Key] = queryParameter.Value; } } } if (!skipFilters) { url.SetFilter(journal.BaseFilter.TableName, lUrl.GetFilterItemsDic(journal.BaseFilter.TableName)); /*foreach (var key in url.QueryParameters.Keys.ToList()) * { * if (!key.Contains(".")) url.QueryParameters.Remove(key); * } * foreach (var queryParameter in lUrl.QueryParameters) * { * if (!queryParameter.Key.Contains(".")) * url.QueryParameters[queryParameter.Key] = queryParameter.Value; * }*/ } } } journal.FixedHeader = IsFixedHeader; journal.FixedColumnsCount = FixedColumnsCount; journal.FixedRowsCount = FixedRowsCount; journal.BaseJournal.BaseInnerHeader.ColumnHierarchy = ColumnHierarchy; journal.StorageValues = StorageValues; journal.BaseJournal.BaseInnerHeader.RowsProperties = HeaderRowsProperties; journal.BaseJournal.RowsProperties = DataRowsProperties; journal.BaseJournal.CellsProperties = DataCellProperties; journal.BaseJournal.ConcatenateColumns = ConcatenateColumns; if (journal.BaseJournal.SelectingColumnControl != null && ConcatenateColumns != null) { journal.BaseJournal.SelectingColumnControl.SetConcatenateColumnProperties(ConcatenateColumns); } if (OrderByColumns != null) { journal.BaseJournal.DefaultOrder = OrderByColumns; } }
public override void Execute(WizardController wizardController, WizardStep step, MainPageUrlBuilder url) { var navigator = CreateNavigator(step.ToForm); if (!ChangeUrlToDestination(wizardController.Navigator, navigator, url)) { return; } url.UserControl = navigator.CurrentNavigator.TableName + "Journal"; url.IsNew = false; url.IsRead = false; NextUrlBuilder = url; }
public static void InitializeSelectMode(this TablePanel tablePanel, MainPageUrlBuilder url) { InitializeSelectMode(tablePanel, url, null); }
public abstract void Execute(WizardController wizardController, WizardStep step, MainPageUrlBuilder url);
/// <summary> /// Обход по дочерним для определения ссылок на журналы /// </summary> /// <param name="urlBuilder"></param> /// <param name="detectedMenu"></param> /// <returns></returns> protected MainPageUrlBuilder InitMenuByChilds(MainPageUrlBuilder urlBuilder, bool detectedMenu) { if (!detectedMenu) { //если урл не определен, то обходим по дочкам и смотрим более подходящий var list = new List <MainPageUrlBuilder>(); foreach (var item in Childs) { item.Parent = this; var itemUrl = item.InitMenu(urlBuilder.Clone(), false); if (itemUrl != null) { list.Add(itemUrl); } } MainPageUrlBuilder resultUrl = null; if (list.Count == 1) { resultUrl = list[0]; } else if (list.Count > 0) { #region определение более подходящего меню MainPageUrlBuilder maxUrl = null; var maxValue = 0; foreach (var itemUrl in list) { var countData = itemUrl.QueryParameters.Keys. Where(key => key.EndsWith(".id")); if (countData.FirstOrDefault() == null) { continue; } var maxInner = countData. Select(key => key.Count(c => c == '.')). Max(); if (maxInner > maxValue) { maxValue = maxInner; maxUrl = itemUrl; } } resultUrl = maxUrl ?? list[0]; #endregion } if (resultUrl == null) { return(null); } //если определяется нормальная ссылка, то обходим дочек еще раз foreach (var item in Childs) { if (item.DetectedUrlBuilder != resultUrl)//пропускаем тот журнал что вернул урл { var url = resultUrl.Clone(); MoveReferenceToChilds(item, GetMenuItem(), url); item.InitMenu(url, true); } } return(resultUrl); } //если урл определено, то обходим по дочкам и отдаем им урл, изменяя параметры родительских таблиц (учитываем референс) foreach (var item in Childs) { item.Parent = this; var url = urlBuilder.Clone(); MoveReferenceToChilds(item, GetMenuItem(), url); item.InitMenu(url, true); } return(null); }
public abstract string GetNavigatorInfoRowName(Type type, string referenceName, MainPageUrlBuilder urlBuilder);
/// <summary> /// Изменяем урл приводя его к урлу дочернего журнала. /// </summary> /// <param name="menuItem"></param> /// <param name="parentMenuItem"></param> /// <param name="url"></param> private static void MoveReferenceToChilds(BaseMenuItem menuItem, BaseMenuItem parentMenuItem, MainPageUrlBuilder url) { if (string.IsNullOrEmpty(menuItem.ReferenceName)) { return; } var keys = url.QueryParameters.Keys.Where(r => r.EndsWith(".id")).ToList(); var refKey = "ref" + parentMenuItem.TableName; if (!parentMenuItem._isCurrentTable && menuItem.Menu.BaseNavigatorControl.BaseNavigatorValues.ContainsKey(parentMenuItem.TableType) && menuItem.Menu.BaseNavigatorControl.BaseNavigatorValues[parentMenuItem.TableType] != null) { //проставление референса по родительской таблице, если она выбрана //смотрим в навигаторе потому как навигатор хранит выбранные записи по референсам (в урле хранится лишнее) var value = menuItem.Menu.BaseNavigatorControl.BaseNavigatorValues[parentMenuItem.TableType].ToString(); url.QueryParameters[refKey] = value; url.QueryParameters[menuItem.ReferenceName + ".id"] = value; } if (keys.Count == 0 && !parentMenuItem._isCurrentTable) { return; } foreach (var key in keys) { var value = url.QueryParameters[key]; url.QueryParameters.Remove(key); url.QueryParameters[menuItem.ReferenceName + "." + key] = value; } //проставляем референс по выбранной записи //смотрим в этой коллекции потому как в текущем журнале изменяется выбранная в урле if (parentMenuItem._isCurrentTable && url.QueryParameters.ContainsKey(refKey)) { var value = url.QueryParameters[refKey]; url.QueryParameters[menuItem.ReferenceName + ".id"] = value; } }
public override void Execute(WizardController wizardController, WizardStep step, MainPageUrlBuilder url) { var navigator = CreateNavigator(step.ToForm); var navigatorInfo = CreateNavigatorInfo(step.ToFormNavigatorInfo); if (!ChangeUrlToDestination(wizardController.Navigator, navigator, url)) { return; } // для строк один к одному проверяем наличие записи if (navigatorInfo.IsOneToOne) { var source = (IDataSourceViewGetName)navigator.CurrentNavigator.DataSource; var paramKey = "ref" + navigatorInfo.TableName; if (url.QueryParameters.ContainsKey(paramKey)) { var key = url.QueryParameters[paramKey]; if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(source.GetName(key))) { return; } } } url.UserControl = navigator.CurrentNavigator.TableName + "Edit"; url.IsNew = true; url.IsRead = false; NextUrlBuilder = url; }
public static object Execute(MainPageUrlBuilder url, string functionClassName) { using (var page = new Page()) return(Execute(page, url, functionClassName)); }
protected internal string GetJournalUrl(MainPageUrlBuilder urlClone) { urlClone.UserControl = TableName + "Journal"; urlClone.IsRead = false; return(urlClone.CreateUrl()); }
public override void SetUrl(MainPageUrlBuilder url) { base.SetUrl(url); ParseFilterParameters(); }
protected void CreateReport(string culture, bool isSubscriptions) { if (webReportManager.Plugin == null) { return; } errorDisplay.Text = ""; ValidateReportEventArgs args = new ValidateReportEventArgs(); if (!webReportManager.Validate(args)) { errorDisplay.ShowError(webReportManager.ErrorText); WriteErrors(errorDisplay, args); return; } //webReportManager.ShowReport(); //StiWebViewer1.Report = webReportManager.Report; //StiWebViewer1.ResetCurrentPage(); if (webReportManager.Plugin != null) { StorageValues values = webReportManager.GetValues(); var sid = new byte[] { }; switch (this.Context.User.Identity.AuthenticationType) { case "Windows": var windowsIdentity = (WindowsIdentity)this.Context.User.Identity; sid = new byte[windowsIdentity.User.BinaryLength]; windowsIdentity.User.GetBinaryForm(sid, 0); break; case "Forms": // note: Получение сида при идентификации по формам. sid = Encoding.Default.GetBytes(User.GetSID()); break; } if (((IWebReportPlugin)webReportManager.Plugin).AllowSaveValuesConditions) { StorageValues.SetStorageValues(webReportManager.Plugin.GetType().FullName, sid, values); } if (!isSubscriptions) { var redirectReportPlugin = webReportManager.Plugin as IRedirectReportPlugin; var backPath = Request.QueryString["backPath"]; var backText = Request.QueryString["text"]; if (string.IsNullOrEmpty(backPath) && webReportManager.Plugin.Visible) { backPath = WebReportManager.GetReportUrl( string.Empty, webReportManager.Plugin.GetType().FullName, string.Empty, string.Empty, false) + "&open=false&setDefaultParams=true"; } if (string.IsNullOrEmpty(backText)) { backText = Resources.SBack; } if (webReportManager.Plugin.Visible) { RememberReports( WebReportManager.GetReportUrl( string.Empty, webReportManager.Plugin.GetType().FullName, string.Empty, string.Empty, false) + "&open=false&setDefaultParams=true", webReportManager.Plugin); } if (redirectReportPlugin != null) { if (redirectReportPlugin.LogViewReport) { Tools.Security.DBDataContext.AddViewReports( Tools.Security.User.GetSID(), HttpContext.Current.User.Identity.Name, HttpContext.Current.User.Identity.Name, ReportInitializerSection.GetReportInitializerSection().ReportPageViewer + "?ClassName=" + redirectReportPlugin.GetType().FullName, HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority), Environment.MachineName, false, redirectReportPlugin.GetType()); } redirectReportPlugin.OpenReport( webReportManager, values, Request.QueryString["rs:format"], culture, HttpUtility.UrlEncode(backPath), backText, Request.QueryString["rs:command"]); } else { var guid = SetSession(values, webReportManager); Response.Redirect( string.Format( "{6}?reportName={0}&expword={4}&values={1}&text={2}&culture={5}&backPath={3}", webReportManager.Plugin.GetType().FullName, guid, backText, HttpUtility.UrlEncode(backPath), Request.QueryString["expword"], culture, ReportInitializerSection.GetReportInitializerSection().ReportingStiReportResultPage)); } // ScriptManager.RegisterStartupScript(btnCreateReport, // GetType(), // "open new window", // string.Format("window.open('ReportResultPage.aspx?reportName={0}&refPerson={1}', '');", // webReportManager.Plugin.GetType().FullName, // refPerson, // Guid.NewGuid().ToString().Replace("-", "")), // true); } else { var guid = SetSession(values, webReportManager); var url = new MainPageUrlBuilder { UserControl = "ReportSubscriptionsEdit", IsDataControl = true, IsNew = true }; url.CustomQueryParameters.Add("guid", guid); /*Определение типа отчета*/ var isSqlReportingServices = Convert.ToByte(webReportManager.Plugin is ISqlReportingServicesPlugin); url.CustomQueryParameters.Add("isSqlReportingServices", isSqlReportingServices.ToString()); url.CustomQueryParameters.Add("reportName", webReportManager.Plugin.GetType().FullName); url.CustomQueryParameters.Add("qscommand", Request.QueryString["rs:command"]); url.CustomQueryParameters.Add("culture", culture); /*Определениe формата выгрузки отчета в зависимости от типа отчета*/ string format = ""; if (isSqlReportingServices == 0) { var webReportPlugin = (IWebReportPlugin)webReportManager.Plugin; var stiPlugin = (IStimulsoftReportPlugin)webReportPlugin; var expToWord = !string.IsNullOrEmpty(Request.QueryString["expword"]); if (!expToWord && stiPlugin.AutoExportTo == null) { format = Request.QueryString["expword"]; } else if (stiPlugin.AutoExportTo != null) { format = stiPlugin.AutoExportTo.Value.ToString(); } } else { format = Request.QueryString["rs:format"]; } /**/ url.CustomQueryParameters.Add("format", format); Page.Response.Redirect(url.CreateUrl(false, true)); } } }
protected bool ChangeUrlToDestination(BaseNavigatorControl fromNavigator, BaseNavigatorControl destinationNavigator, MainPageUrlBuilder url) { if (fromNavigator.CurrentNavigator.TableType == destinationNavigator.CurrentNavigator.TableType) { return(true); } var childToCurrent = destinationNavigator.CurrentNavigator.ParentNavigators.FirstOrDefault(r => r.TableType == fromNavigator.CurrentNavigator.TableType); if (childToCurrent != null) { ChangeUrlToChild(url, childToCurrent.ReferenceName, fromNavigator.CurrentNavigator.TableName); return(true); } var toParent = fromNavigator.CurrentNavigator.ParentNavigators.FirstOrDefault(r => r.TableType == destinationNavigator.CurrentNavigator.TableType); if (toParent != null) { ChangeUrlToParent(url, toParent.ReferenceName, destinationNavigator.CurrentNavigator.TableName); return(true); } var parent = fromNavigator.CurrentNavigator.ParentNavigators .Select(r => new { toParent = r, toChild = destinationNavigator.CurrentNavigator.ParentNavigators.FirstOrDefault(t => t.TableType == r.TableType) }) .FirstOrDefault(r => r.toChild != null); if (parent != null) { ChangeUrlToParent(url, parent.toParent.ReferenceName, parent.toParent.TableName); ChangeUrlToChild(url, parent.toChild.ReferenceName, parent.toParent.TableName); return(true); } var doubleParent = fromNavigator.CurrentNavigator.ParentNavigators .SelectMany(r => r.ParentNavigators.Select(c => new { toParent0 = r, toParent1 = c })) .Select( r => new { r.toParent0, r.toParent1, toChild = destinationNavigator.CurrentNavigator.ParentNavigators.FirstOrDefault(t => t.TableType == r.toParent1.TableType) }) .FirstOrDefault(r => r.toChild != null); if (doubleParent != null) { ChangeUrlToParent(url, doubleParent.toParent0.ReferenceName, doubleParent.toParent0.TableName); ChangeUrlToParent(url, doubleParent.toParent1.ReferenceName, doubleParent.toParent1.TableName); ChangeUrlToChild(url, doubleParent.toChild.ReferenceName, doubleParent.toParent1.TableName); return(true); } var tripleParent = fromNavigator.CurrentNavigator.ParentNavigators .SelectMany(r => r.ParentNavigators.Select(c => new { toParent0 = r, toParent1 = c })) .SelectMany(r => r.toParent1.ParentNavigators.Select(c => new { r.toParent0, r.toParent1, toParent2 = c })) .Select( r => new { r.toParent0, r.toParent1, r.toParent2, toChild = destinationNavigator.CurrentNavigator.ParentNavigators.FirstOrDefault(t => t.TableType == r.toParent2.TableType) }) .FirstOrDefault(r => r.toChild != null); if (tripleParent != null) { ChangeUrlToParent(url, tripleParent.toParent0.ReferenceName, tripleParent.toParent0.TableName); ChangeUrlToParent(url, tripleParent.toParent1.ReferenceName, tripleParent.toParent1.TableName); ChangeUrlToParent(url, tripleParent.toParent2.ReferenceName, tripleParent.toParent2.TableName); ChangeUrlToChild(url, tripleParent.toChild.ReferenceName, tripleParent.toParent2.TableName); return(true); } return(false); }