/// <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)); }
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"); } }
/// <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))); }
/// <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))); }
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; }
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()); }
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; }
/// <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); }
/// <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); }
/// <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; } } } }
/// <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))); }
/// <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))); }
public DataSelectorLimit(IDataSelector dataSelector, long limit) { _dataSelector = dataSelector; _limit = limit; }
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); } } } }