/// <summary> /// Конструктор сущности, представляющей в Linq-выражении псевдодетейл. /// </summary> /// <param name="view"> Представление псевдодетейла. </param> /// <param name="masterLinkName"> Имя связи от псевдодетейла к мастеру. </param> /// <param name="masterToDetailPseudoProperty"> Имя связи от мастера к псевдодетейлу (псевдосвойство). </param> public PseudoDetail( ICSSoft.STORMNET.View view, string masterLinkName, string masterToDetailPseudoProperty) : this(view, masterLinkName, masterToDetailPseudoProperty, null) { }
/// <summary> /// Конструктор сущности, представляющей в Linq-выражении псевдодетейл. /// </summary> /// <param name="view"> Представление псевдодетейла. </param> /// <param name="masterLinkName"> Имя связи от псевдодетейла к мастеру. </param> /// <param name="masterToDetailPseudoProperty"> Имя связи от мастера к псевдодетейлу (псевдосвойство). </param> /// <param name="masterConnectProperties"> Свойства мастера, по которым можно произвести соединение. Аналог OwnerConnectProp для <see cref="DetailVariableDef"/> в lcs. </param> public PseudoDetail( ICSSoft.STORMNET.View view, string masterLinkName, string masterToDetailPseudoProperty, string[] masterConnectProperties) { if (view == null) { throw new ArgumentNullException("view"); } if (view.DefineClassType != typeof(TP)) { throw new CantFindViewException(typeof(TP), view.Name); } if (masterLinkName == null || string.IsNullOrEmpty(masterLinkName.Trim())) { throw new ArgumentException("Заданное имя связи от псевдодетейла к мастеру некорректно."); } PseudoDetailView = view; MasterLinkName = masterLinkName; MasterToDetailPseudoProperty = string.IsNullOrEmpty(masterToDetailPseudoProperty) ? string.Format( "{0}__{1}", view.DefineClassType.Name.Replace(".", string.Empty), masterLinkName) : masterToDetailPseudoProperty; MasterConnectProperties = masterConnectProperties; }
/// <summary> /// Конструктор сущности, представляющей в Linq-выражении псевдодетейл. /// </summary> /// <param name="view"> Представление псевдодетейла. </param> /// <param name="masterLink"> Метод, определяющий имя связи от псевдодетейла к мастеру (определение идёт через "Information.ExtractPropertyPath(masterLink)"). </param> /// <param name="masterToDetailPseudoProperty"> Имя связи от мастера к псевдодетейлу (псевдосвойство). </param> public PseudoDetail( ICSSoft.STORMNET.View view, Expression <Func <TP, object> > masterLink, string masterToDetailPseudoProperty) : this(view, Information.ExtractPropertyPath(masterLink), masterToDetailPseudoProperty, null) { }
/// <summary> /// /// </summary> /// <param name="ldColumnsSort">сортировка</param> /// <param name="ldLimitFunction">ограничение</param> /// <param name="ldLoadingTypes">загружаемые типы</param> /// <param name="ldView">представление</param> /// <param name="ldColumnsOrder">порядочек колонок</param> public void Init( ColumnsSortDef[] ldColumnsSort, Function ldLimitFunction, System.Type[] ldLoadingTypes, ICSSoft.STORMNET.View ldView, string[] ldColumnsOrder) { Init(ldColumnsSort, ldLimitFunction, ldLoadingTypes, ldView, null, ldColumnsOrder); }
/// <summary> /// /// </summary> /// <param name="ldColumnsSort">сортировка</param> /// <param name="ldLimitFunction">ограничение</param> /// <param name="ldLoadingTypes">загружаемые типы</param> /// <param name="ldView">представление</param> /// <param name="ldAdvansedColumns">дополнительные колонки</param> /// <param name="ldColumnsOrder">порядочек колонок</param> public void Init( ColumnsSortDef[] ldColumnsSort, Function ldLimitFunction, System.Type[] ldLoadingTypes, ICSSoft.STORMNET.View ldView, AdvansedColumn[] ldAdvansedColumns, string[] ldColumnsOrder) { // ldLimitFunction.Cop // Перед инициализацией LCS скопируем настройки колонок и ограничения, чтобы внутрь lcs if (ldColumnsSort != null) { fieldColumnsSort = new ColumnsSortDef[ldColumnsSort.Length]; ldColumnsSort.CopyTo(fieldColumnsSort, 0); } // fieldColumnsSort = ldColumnsSort; // ldLimitFunction.FunctionDef.CopyTo() // ldLimitFunction.Parameters.CopyTo if (ldLimitFunction != null) { fieldLimitFunction = ldLimitFunction.Clone(); } if (ldLoadingTypes != null) { fieldLoadingTypes = new Type[ldLoadingTypes.Length]; ldLoadingTypes.CopyTo(fieldLoadingTypes, 0); } // fieldLoadingTypes = ldLoadingTypes; if (ldView != null) { fieldView = ldView.Clone(); } // fieldView = ldView; if (ldColumnsOrder != null) { fieldColumnsOrder = new string[ldColumnsOrder.Length]; ldColumnsOrder.CopyTo(fieldColumnsOrder, 0); } // fieldColumnsOrder = ldColumnsOrder; if (ldAdvansedColumns != null) { fieldAdvansedColumns = new AdvansedColumn[ldAdvansedColumns.Length]; ldAdvansedColumns.CopyTo(fieldAdvansedColumns, 0); } // fieldAdvansedColumns = ldAdvansedColumns; }
public static IQueryable <T> Where <T, TP>( this IQueryable <T> source, ICSSoft.STORMNET.View view, Expression <Func <TP, object> > masterLink, Expression <Func <IQueryable <TP>, bool> > predicate, string masterToDetailPseudoProperty = null) where T : DataObject where TP : DataObject { string masterLinkName = Information.ExtractPropertyPath(masterLink); return(source.Where(view, masterLinkName, predicate, masterToDetailPseudoProperty)); }
public static IQueryable <T> Where <T, TP>( this IQueryable <T> source, ICSSoft.STORMNET.View view, string masterLinkName, Expression <Func <IQueryable <TP>, bool> > predicate, string masterToDetailPseudoProperty = null) where T : DataObject where TP : DataObject { // Поскольку дальше сложнее получать типы T и TP, то проверка представления проходит здесь if (Information.GetView(view.Name, typeof(TP)) == null) { // То есть представление с указанным именем не найдено в классе throw new CantFindViewException(typeof(TP), view.Name); } if (predicate.Body == null || !(predicate.Body is MethodCallExpression)) { throw new NotSupportedException(); } var methodCallExpression = (MethodCallExpression)predicate.Body; var pseudoDetail = new PseudoDetail <T, TP>(view, masterLinkName, masterToDetailPseudoProperty); if (methodCallExpression.Method.Name == "Any") { switch (methodCallExpression.Arguments.Count()) { case 1: return(source.Where(x => pseudoDetail.Any(y => true))); case 2: var realLambda = (Expression <Func <TP, bool> >)((UnaryExpression)methodCallExpression.Arguments[1]).Operand; return(source.Where(x => pseudoDetail.Any(realLambda))); default: throw new NotSupportedException(); } } if (methodCallExpression.Method.Name == "All" && methodCallExpression.Arguments.Count() == 2) { var realLambda = (Expression <Func <TP, bool> >)((UnaryExpression)methodCallExpression.Arguments[1]).Operand; return(source.Where(x => pseudoDetail.All(realLambda))); } throw new NotSupportedException(); }
public static IQueryable <T> Where <T, TP>( this IQueryable <T> source, ICSSoft.STORMNET.View view, Expression <Func <IQueryable <TP>, bool> > predicate, string masterToDetailPseudoProperty = null) where T : DataObject where TP : DataObject { var masterLinkName = Information.GetAgregatePropertyName(typeof(TP)); if (string.IsNullOrEmpty(masterLinkName)) { throw new NotFoundAggregatorProperty(); } return(source.Where(view, masterLinkName, predicate, masterToDetailPseudoProperty)); }
/// <summary> /// Разбор /// </summary> /// <param name="value"></param> /// <param name="v"></param> /// <returns></returns> static public FunctionForControls Parse(string value, ICSSoft.STORMNET.View v) { System.Xml.XmlDocument doc = new System.Xml.XmlDocument(); doc.LoadXml(value); ICSSoft.STORMNET.FunctionalLanguage.FunctionalLanguageDef lang = ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef.LanguageDef; ICSSoft.STORMNET.FunctionalLanguage.VariableDef[] vars; ArrayList arvars = new ArrayList(); arvars.Add(new ICSSoft.STORMNET.FunctionalLanguage.VariableDef((lang as ICSSoft.STORMNET.FunctionalLanguage.SQLWhere.SQLWhereLanguageDef).GuidType, "STORMMainObjectKey")); foreach (ICSSoft.STORMNET.PropertyInView piv in v.Properties) { System.Type propType = ICSSoft.STORMNET.Information.GetPropertyType(v.DefineClassType, piv.Name); try { ICSSoft.STORMNET.FunctionalLanguage.ObjectType t = lang.GetObjectTypeForNetType(propType); if (t != null) { arvars.Add(new ICSSoft.STORMNET.FunctionalLanguage.VariableDef(t, piv.Name, piv.Caption)); } } catch { } } vars = (ICSSoft.STORMNET.FunctionalLanguage.VariableDef[])arvars.ToArray(typeof(ICSSoft.STORMNET.FunctionalLanguage.VariableDef)); ICSSoft.STORMNET.FunctionalLanguage.Function fnc = FromXMLElements((System.Xml.XmlElement)doc.FirstChild, lang, vars); FunctionForControls res = null; if (fnc == null) { res = new FunctionForControls(v, fnc); } else { res = new FunctionForControls(v, fnc.FunctionDef, fnc.Parameters.ToArray()); } try { res.Name = ((System.Xml.XmlElement)doc.FirstChild).GetAttribute("___Name"); } catch { } return(res); }
/// <summary> /// конструктор /// </summary> /// <param name="view"></param> /// <param name="def"></param> /// <param name="parameters"></param> public FunctionForControls(ICSSoft.STORMNET.View view, ICSSoft.STORMNET.FunctionalLanguage.FunctionDef def, params object[] parameters) { function = new ICSSoft.STORMNET.FunctionalLanguage.Function(def, parameters); this.View = view; }
/// <summary> /// конструктор /// </summary> /// <param name="view"></param> /// <param name="func"></param> public FunctionForControls(ICSSoft.STORMNET.View view, ICSSoft.STORMNET.FunctionalLanguage.Function func) { this.View = view; this.function = func; }
/// <summary> /// Разбор /// </summary> /// <param name="value"></param> /// <param name="type"></param> /// <param name="viewname"></param> /// <returns></returns> static public FunctionForControls Parse(string value, Type type, string viewname) { ICSSoft.STORMNET.View v = ICSSoft.STORMNET.Information.GetView(viewname, type); return(Parse(value, v)); }
/// <summary> /// Конструктор сущности, представляющей в Linq-выражении настоящий детейл (для псевдодетейлов данный метод будет некорректен). /// </summary> /// <param name="view"> Представление детейла. </param> public PseudoDetail( ICSSoft.STORMNET.View view) : this(view, GetMasterLinkNameForRealDetail(), string.Empty, null) { }
/// <summary> /// Конструктор сущности, представляющей в Linq-выражении псевдодетейл. /// </summary> /// <param name="view"> Представление псевдодетейла. </param> /// <param name="masterLinkName"> Имя связи от псевдодетейла к мастеру. </param> public PseudoDetail( ICSSoft.STORMNET.View view, string masterLinkName) : this(view, masterLinkName, string.Empty, null) { }
/// <summary> /// Десереализация /// </summary> /// <param name="info"></param> /// <param name="context"></param> public LoadingCustomizationStruct(SerializationInfo info, StreamingContext context) { string s1 = info.GetString("ddd"); // return; this.fieldColumnsSort = (ColumnsSortDef[])info.GetValue("fieldColumnsSort", typeof(ColumnsSortDef[])); // this.fieldLimitFunction = ( STORMFunction )info.GetValue( "fieldLimitFunction", typeof( STORMFunction ) ); this.fieldLoadingTypes = (System.Type[])info.GetValue("fieldLoadingTypes", typeof(System.Type[])); this.fieldView = (ICSSoft.STORMNET.View)info.GetValue("fieldView", typeof(ICSSoft.STORMNET.View)); this.fieldColumnsOrder = (string[])info.GetValue("fieldColumnsOrder", typeof(string[])); this.fieldAdvansedColumns = (AdvansedColumn[])info.GetValue("fieldAdvansedColumns", typeof(AdvansedColumn[])); this.fieldInitDataCopy = info.GetBoolean("fieldInitDataCopy"); // [2012-05-21 Истомин] далее идут куча try\catch, нужны были для того, чтобы старые ограничения не упали try { // Может сгенерироваться 3 вида исключений: ArgumentNullException, InvalidCastException, SerializationException // Ловить будем только SerializationException ReturnType = (LcsReturnType)info.GetValue("ReturnType", typeof(LcsReturnType)); } catch (SerializationException) { ReturnType = LcsReturnType.Objects; } try { // Может сгенерироваться 3 вида исключений: ArgumentNullException, InvalidCastException, SerializationException // Ловить будем только SerializationException ReturnTop = info.GetInt32("ReturnTop"); } catch (SerializationException) { ReturnTop = 0; } try { // Может сгенерироваться 3 вида исключений: ArgumentNullException, InvalidCastException, SerializationException // Ловить будем только SerializationException LoadingBufferSize = info.GetInt32("LoadingBufferSize"); } catch (SerializationException) { LoadingBufferSize = 0; } try { // Может сгенерироваться 3 вида исключений: ArgumentNullException, InvalidCastException, SerializationException // Ловить будем только SerializationException RowNumber = (RowNumberDef)info.GetValue("RowNumber", typeof(RowNumberDef)); } catch (SerializationException) { RowNumber = null; } try { // Может сгенерироваться 3 вида исключений: ArgumentNullException, InvalidCastException, SerializationException // Ловить будем только SerializationException Distinct = info.GetBoolean("Distinct"); } catch (SerializationException) { Distinct = false; } bool bNull = info.GetBoolean("fieldLimitFunctionNull"); if (!bNull) { string sFunction = info.GetString("fieldLimitFunctionStr"); FunctionalLanguage.FunctionForControls fcc = FunctionalLanguage.FunctionForControls.Parse( sFunction, this.fieldView); this.fieldLimitFunction = fcc.Function; } else { this.fieldLimitFunction = null; } bool keynull = info.GetBoolean("keynull"); if (!keynull) { var tp = (Type)info.GetValue("keytype", typeof(Type)); string s = info.GetString("keystr"); if (tp == typeof(int)) { creatorKey = int.Parse(s); } else { MethodInfo mi = tp.GetMethod("Parse", BindingFlags.Static | BindingFlags.Public); creatorKey = mi != null ? mi.Invoke(null, new object[] { s }) : Activator.CreateInstance(tp, new object[] { s }); } } }