/// <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> /// 获取指定字段值相等的数据 /// </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)); }
/// <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 ISqlExpress Update(string dbtypeName) { var dt = ModelType.GetDataModel().DbType; switch (dt) { case DataModel.DbTypeForDataModel.Table: return(QuerySqlFactory.CreateTableDefineSql(dbtypeName, ModelType)); default: throw new UnkownCodeException(ErrorCodes.UnkownError, string.Format(LocalResource.NotSupportCreateDatabaseObject, dt.GetEnumDisplayName())); } }
/// <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); } } }
/// <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))); }