Example #1
0
        /// <summary>
        /// 获取指定字段值相等的数据
        /// </summary>
        /// <typeparam name="T">数据模型类型</typeparam>
        /// <param name="view"></param>
        /// <param name="fieldname">字段名称数组</param>
        /// <param name="fieldvalue">字段值数组</param>
        /// <param name="selectFieldNames">SELECT部分的字段名称数组,传null指示使用*选择</param>
        /// <returns></returns>
        public static IEnumerable <T> GetDataListByFieldEqValue <T>(this IDataSelector view, IEnumerable <string> fieldname, IEnumerable <object> fieldvalue, IEnumerable <string> selectFieldNames)
            where T : class, new()
        {
            List <IDataParamet> pvs     = new List <IDataParamet>();
            List <string>       filters = new List <string>();

            if (fieldname != null && fieldvalue != null)
            {
                int c = fieldname.Count();
                for (int i = 0; i < c; i++)
                {
                    IDataParamet p;
                    string       f = QuerySqlFactory.CreateEqWhere(view.DbTypeName, fieldname.ElementAt(i), fieldvalue.ElementAt(i), out p);
                    if (!string.IsNullOrEmpty(f))
                    {
                        filters.Add(f);
                    }
                    if (p != null)
                    {
                        pvs.Add(p);
                    }
                }
            }
            return(GetDataListByAndFilterExpress <T>(view, filters, pvs, selectFieldNames));
        }
Example #2
0
        public ComparePredicate(IDataSelector firstArgumentSelector, IDataSelector secondArgumentSelector, CompareType type)
        {
            Contract.Requires(firstArgumentSelector != null);
            Contract.Requires(secondArgumentSelector != null);

            _firstArgumentSelector  = firstArgumentSelector;
            _secondArgumentSelector = secondArgumentSelector;

            switch (type)
            {
            case CompareType.Less:
                _checkComparisonResult = r => r < 0;
                break;

            case CompareType.LessOrEqual:
                _checkComparisonResult = r => r <= 0;
                break;

            case CompareType.Greater:
                _checkComparisonResult = r => r > 0;
                break;

            case CompareType.GreaterOrEqual:
                _checkComparisonResult = r => r >= 0;
                break;

            default:
                throw new ArgumentOutOfRangeException("type");
            }
        }
Example #3
0
        /// <summary>
        /// 获取指定anditems条件数组为并且的查询对象
        /// </summary>
        /// <param name="view"></param>
        /// <param name="modelType">数据模型类型</param>
        /// <param name="anditems">并且表达式</param>
        /// <param name="paramets">表达式参数数组</param>
        /// <param name="selectFieldNames">SELECT部分的字段名称数组,传null指示使用*选择</param>
        /// <returns></returns>
        public static object GetDataByAndFilterExpress(this IDataSelector view, Type modelType, IEnumerable <string> anditems, IEnumerable <IDataParamet> paramets, IEnumerable <string> selectFieldNames)
        {
            IEnumerable <IDataParamet> pvs;
            string andfilter = QuerySqlFactory.UnionWhereForAnd(view.DbTypeName, anditems, paramets, out pvs);

            return(view.ExecuteReaderOfFirstFor(QuerySqlFactory.CreateQuerySqlByFilters(view.DbTypeName, modelType, andfilter, pvs, selectFieldNames, 1)));
        }
Example #4
0
        public ComparePredicate(IDataSelector firstArgumentSelector, IDataSelector secondArgumentSelector, CompareType type)
        {
            Contract.Requires(firstArgumentSelector != null);
            Contract.Requires(secondArgumentSelector != null);

            _firstArgumentSelector = firstArgumentSelector;
            _secondArgumentSelector = secondArgumentSelector;

            switch (type)
            {
                case CompareType.Less:
                    _checkComparisonResult = r => r < 0;
                    break;
                case CompareType.LessOrEqual:
                    _checkComparisonResult = r => r <= 0;
                    break;
                case CompareType.Greater:
                    _checkComparisonResult = r => r > 0;
                    break;
                case CompareType.GreaterOrEqual:
                    _checkComparisonResult = r => r >= 0;
                    break;
                default:
                    throw new ArgumentOutOfRangeException("type");
            }
        }
Example #5
0
        /// <summary>
        /// 获取指定anditems条件数组为并且的查询对象
        /// </summary>
        /// <typeparam name="T">数据模型类型</typeparam>
        /// <param name="view"></param>
        /// <param name="anditems">并且表达式</param>
        /// <param name="paramets">表达式参数数组</param>
        /// <param name="selectFieldNames">SELECT部分的字段名称数组,传null指示使用*选择</param>
        /// <returns></returns>
        public static T GetDataByAndFilterExpress <T>(this IDataSelector view, IEnumerable <string> anditems, IEnumerable <IDataParamet> paramets, IEnumerable <string> selectFieldNames)
            where T : class, new()
        {
            IEnumerable <IDataParamet> pvs;
            string andfilter = QuerySqlFactory.UnionWhereForAnd(view.DbTypeName, anditems, paramets, out pvs);

            return(view.ExecuteReaderOfFirst <T>(QuerySqlFactory.CreateQuerySqlByFilters(view.DbTypeName, typeof(T), andfilter, pvs, selectFieldNames, 1)));
        }
Example #6
0
        public void Initialize(IList <ISet> sets, List <IDataCombiner> combiners, IComparer comparer)
        {
            if (_combiners == null)
            {
                _combiners = combiners;
            }

            if (_dataSelector == null)
            {
                _dataSelector = new DataSelectorOrdered();
            }

            _dataSelector.Initialize(sets, combiners, comparer);
            _comparer = comparer;
        }
Example #7
0
        Exception IUpdateChecker.CheckErrors(IUpdateContext context, IEnumerable <IUpdateContext> grouptocommit, IDataSelector dataSelector)
        {
            CurrentContext  = context;
            CurrentGroups   = grouptocommit;
            CurrentSelector = dataSelector;
            if (context is IDataUpdateContext)
            {
                IDataUpdateContext k = context as IDataUpdateContext;
                switch (k.ModalState)
                {
                case ModalState.AddNew: return(CheckAddNew());

                case ModalState.Update: return(CheckUpdate());

                case ModalState.Delete: return(CheckDelete());

                default: return(null);
                }
            }
            return(CheckUnkownUpdateContext());
        }
Example #8
0
        private int _numOfRequiredDocuments;    // Only required number of documents are returned by to the client

        public IterativeOperation(IList <ISet> sets, List <IDataCombiner> combiners, IDataSelector dataSelector, IComparer comparer)
        {
            _lastReaderId    = null;
            _lastSentChunkId = -1;
            _dataSelector    = dataSelector;
            IList <ISet> setsToBeRemoved = new List <ISet>();

            foreach (var set in sets)
            {
                if (set.IsFixedSize == true && set.GetTopElement() == null)
                {
                    setsToBeRemoved.Add(set);
                    set.DisposeReader();
                }
            }

            ListUtilMethods.RemoveMultipleItemsFromList(sets, setsToBeRemoved);

            _dataSelector.Initialize(sets, combiners, comparer);
            _lastSentDataChunk = null;
            _autoChunkId       = -1;
        }
Example #9
0
        /// <summary>
        /// 检测数据中引用的Id是否存在
        /// </summary>
        /// <param name="dm"></param>
        /// <param name="modalcontext"></param>
        /// <param name="d"></param>
        /// <param name="view"></param>
        /// <returns></returns>
        private bool CheckDataIdRefenceIsExists(
            IDataModel dm,
            IDataUpdateContext modalcontext,
            DataIdRefenceAttribute d,
            out long rfid)
        {
            rfid = 0;
            IDataSelector view = CurrentSelector;
            //获取引用数据的Id值
            object refeceId = modalcontext.Data.GetMemberValue(d.SourceFieldName);

            if (refeceId != null && (refeceId is long || refeceId is long?))
            {
                long id = (long)refeceId;
                if (id > 0)
                {
                    rfid = id;
                    //创建引用数据类型的参数
                    Type          refeeType    = d.RefenceModalType != null ? d.RefenceModalType : modalcontext.ModalType;
                    List <string> eqfieldnames = new List <string>();
                    List <object> eqvalues     = new List <object>();
                    eqfieldnames.Add("Id");
                    eqvalues.Add(id);
                    //是否是软删除模型
                    var    refeeDm      = refeeType.GetDataModel();
                    string softdeltekey = refeeDm.GetSoftDeleteFieldName();
                    if (!string.IsNullOrEmpty(softdeltekey))
                    {
                        eqfieldnames.Add(softdeltekey);
                        eqvalues.Add(false);
                    }

                    return(view.GetDataByFieldEqValue(refeeType, eqfieldnames, eqvalues, new string[] { "Id" }) != null);
                }
            }
            //值为null,返回引用正常
            return(true);
        }
Example #10
0
        /// <summary>
        /// 判断自身父子类型中指定的child是否是sourceid的子级
        /// </summary>
        /// <param name="modalType"></param>
        /// <param name="sourceid"></param>
        /// <param name="childid"></param>
        /// <returns></returns>
        public static bool IsChildId(Type modalType, long sourceid, long childid, string parentfieldid, IDataSelector view)
        {
            if (sourceid == childid)
            {
                return(false);
            }
            object        filter       = modalType.CreateObject();
            List <string> parametnames = new List <string>();

            parametnames.Add(parentfieldid);
            List <object> parvalues = new List <object>();

            parvalues.Add(sourceid);
            var softdelkey = modalType.GetDataModel().GetSoftDeleteFieldName();

            if (!string.IsNullOrEmpty(softdelkey))
            {
                parametnames.Add(softdelkey);
                parvalues.Add(false);
            }
            var l = view.GetDataListByFieldEqValue(modalType, parametnames, parvalues, new string[] { "Id", parentfieldid });

            if (l != null)
            {
                foreach (object o in l)
                {
                    long id = (long)o.GetMemberValue("Id");
                    if (id == childid)
                    {
                        return(true);
                    }
                    if (IsChildId(modalType, id, childid, parentfieldid, view))
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
Example #11
0
        /// <summary>
        /// 检测唯一规则
        /// </summary>
        /// <param name="view"></param>
        /// <param name="dm"></param>
        /// <param name="onlyattr"></param>
        /// <param name="uponlyfields"></param>
        /// <param name="modalcontext"></param>
        /// <param name="errs"></param>
        private void CheckOnlyValues(
            IDataModel dm,
            OnlyValueKeysAttribute onlyattr,
            IEnumerable <string> uponlyfields,
            IDataUpdateContext modalcontext,
            IList <DataModalFieldException> errs)
        {
            if (((modalcontext.ModalState & ModalState.AddNew) == ModalState.AddNew ||
                 (modalcontext.ModalState & ModalState.Update) == ModalState.Update) &&
                onlyattr != null && onlyattr.OnlyKeys != null && onlyattr.OnlyKeys.Count() > 0 &&
                uponlyfields != null && uponlyfields.Count() > 0)
            {
                IDataSelector view = CurrentSelector;
                object        data = modalcontext.Data;
                //要查询的参数名称
                List <string> parametnames = new List <string>(onlyattr.OnlyKeys);
                //构建查选参数
                object paramet = modalcontext.ModalType.CreateObject();
                switch (modalcontext.ModalState)
                {
                case ModalState.AddNew:
                {
                    //设置所有唯一值
                    foreach (var str in parametnames)
                    {
                        var f = dm.Fields[str];
                        f.SetModelFieldValue(paramet, f.GetModelFieldValue(data));
                    }
                    break;
                }

                case ModalState.Update:
                {
                    paramet.SetPropertyValue("Id", data.GetPropertyValue("Id"));
                    object orgvalue = null;
                    foreach (var str in parametnames)
                    {
                        if (uponlyfields.FirstOrDefault(f => string.Equals(f, str, StringComparison.OrdinalIgnoreCase)) != null)
                        {
                            //值已修改
                            var f = dm.Fields[str];
                            f.SetModelFieldValue(paramet, f.GetModelFieldValue(data));
                        }
                        else
                        {
                            //值未修改
                            //获取原值
                            if (orgvalue == null)
                            {
                                orgvalue = view.GetDataById(modalcontext.ModalType, null, (long)data.GetMemberValue("Id"));
                            }
                            var f = dm.Fields[str];
                            f.SetModelFieldValue(paramet, f.GetModelFieldValue(orgvalue));
                        }
                    }
                    break;
                }
                }
                //全为null值时的策略
                if (!onlyattr.IsIncludeAllNull && IsAllNullValue(paramet, onlyattr.OnlyKeys, dm))
                {
                    return;
                }
                string softdelfieldname = dm.GetSoftDeleteFieldName();
                if (!string.IsNullOrEmpty(softdelfieldname))
                {
                    //该模型是软删除模型
                    //设置为未删除
                    if (!parametnames.Contains(softdelfieldname))
                    {
                        parametnames.Add(softdelfieldname);
                    }
                    dm.Fields[softdelfieldname].SetModelFieldValue(paramet, false);
                }

                List <string>       filters  = new List <string>();
                List <IDataParamet> filterpn = new List <IDataParamet>();
                foreach (var pn in parametnames)
                {
                    IDataParamet pv;
                    string       f = QuerySqlFactory.CreateEqWhere(view.DbTypeName, pn, dm.Fields[pn].GetModelFieldValue(paramet), out pv);
                    if (!string.IsNullOrEmpty(f))
                    {
                        filters.Add(f);
                    }
                    if (pv != null)
                    {
                        filterpn.Add(pv);
                    }
                }

                switch (modalcontext.ModalState)
                {
                case ModalState.Update:
                {
                    //排除本身的条件
                    long         id = (long)data.GetPropertyValue("Id");
                    IDataParamet pv;
                    string       f = QuerySqlFactory.CreateNotEqWhere(view.DbTypeName, "Id", id, out pv);
                    if (!string.IsNullOrEmpty(f))
                    {
                        filters.Add(f);
                    }
                    if (pv != null)
                    {
                        filterpn.Add(pv);
                    }
                    break;
                }
                }
                if (view.GetDataByAndFilterExpress(modalcontext.ModalType, filters, filterpn, new string[] { "Id" }) != null)
                {
                    AddOnlyValueErrors(onlyattr.OnlyKeys, dm, errs);
                }
            }
        }
 private void CheckError(IUpdateContext upd, IEnumerable <IUpdateContext> grouptocommit, IDataSelector dataselector)
 {
     if (upd is IDataUpdateContext)
     {
         IDataUpdateContext upd2 = upd as IDataUpdateContext;
         var checker             = GetChecker(upd2.ModalType);
         if (checker != null)
         {
             var e = checker.CheckErrors(upd2, grouptocommit, dataselector);
             if (e != null)
             {
                 throw e;
             }
         }
     }
 }
Example #13
0
 /// <summary>
 /// 获取指定Id的数据
 /// </summary>
 /// <typeparam name="T">数据模型类型</typeparam>
 /// <param name="view"></param>
 /// <param name="selectFieldNames">SELECT部分的字段名称数组,传null指示使用*选择</param>
 /// <param name="id">要获取数据的Id</param>
 /// <returns></returns>
 public static T GetDataById <T>(this IDataSelector view, IEnumerable <string> selectFieldNames, long id)
     where T : class, new()
 {
     return(view.ExecuteReaderOfFirst <T>(QuerySqlFactory.CreateQuerySqlByIdValue(view.DbTypeName, typeof(T), selectFieldNames, id)));
 }
Example #14
0
 /// <summary>
 /// 获取指定Id的数据
 /// </summary>
 /// <param name="view"></param>
 /// <param name="modelType">数据模型类型</param>
 /// <param name="selectFieldNames">SELECT部分的字段名称数组,传null指示使用*选择</param>
 /// <param name="id">要获取数据的Id</param>
 /// <returns></returns>
 public static object GetDataById(this IDataSelector view, Type modelType, IEnumerable <string> selectFieldNames, long id)
 {
     return(view.ExecuteReaderOfFirstFor(QuerySqlFactory.CreateQuerySqlByIdValue(view.DbTypeName, modelType, selectFieldNames, id)));
 }
Example #15
0
 public DataSelectorLimit(IDataSelector dataSelector, long limit)
 {
     _dataSelector = dataSelector;
     _limit        = limit;
 }
Example #16
0
 public DataSelectorSkip(IDataSelector dataSelector, long skip)
 {
     _dataSelector = dataSelector;
     _skip         = skip;
 }
 private void UpdateToDatabase(IUpdateContext upd, IDatabaseAdptor db, IEnumerable <IUpdateContext> grouptocommit, IDataSelector dataselector)
 {
     if (!upd.SuccessUpdate)
     {
         var sql = upd.Update(db.DbTypeName);
         if (sql != null)
         {
             if (upd.UpdateDataNoty != null)
             {
                 upd.UpdateDataNoty.BeforeChange(upd, grouptocommit, dataselector);
             }
             upd.SuccessCommitToDatabase(db.CommitToDatabase(sql));
             if (upd.UpdateDataNoty != null)
             {
                 upd.UpdateDataNoty.OnChanged(upd, grouptocommit, dataselector);
             }
         }
     }
 }