/// <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 });
                }
            }
        }