/// <summary> /// 缓存键值操作。 /// </summary> /// <param name="cache">缓存对象。</param> /// <param name="entity">当前实体对象。</param> /// <param name="field">当前字段。</param> /// <param name="func">缓存求值委托。</param> /// <returns>返回</returns> protected virtual object CacheFunc(IDataBinderObjectCache cache, object entity, string field, CacheValueFunc func) { if (cache != null && AllowCache) { object value; if (!cache.Get(entity, field, out value)) { value = func(); cache.Set(entity, field, value); } return(value); } else { return(func()); } }
/// <summary> /// 缓存键值操作。 /// </summary> /// <param name="cache">缓存对象。</param> /// <param name="builder">select命令构造器。</param> /// <param name="tag">标记。</param> /// <param name="type">类型。</param> /// <param name="func">缓存求值委托。</param> /// <returns>返回</returns> protected virtual object CacheFunc(IDataBinderObjectCache cache, Symbol.Data.ISelectCommandBuilder builder, string tag, Type type, CacheValueFunc func) { if (cache != null && AllowCache) { object value; string key = BuildCacheKey(builder, tag, type); if (!cache.Get(key, out value)) { value = func(); cache.Set(key, value); } return(value); } else { return(func()); } }
/// <summary> /// 绑定数据。 /// </summary> /// <param name="dataContext">数据上下文对象。</param> /// <param name="reader">数据查询读取器。</param> /// <param name="entity">当前实体对象。</param> /// <param name="field">当前字段。</param> /// <param name="type">实体中字段的类型。</param> /// <param name="cache">缓存。</param> /// <returns>返回绑定的数据。</returns> public override object Bind(IDataContext dataContext, IDataQueryReader reader, object entity, string field, Type type, IDataBinderObjectCache cache) { using (var builder = dataContext.CreateSelect(SourceName)) { builder.Count(); var condition = MapObject(Condition, dataContext, entity, reader); builder.Query(condition); return(CacheFunc(cache, builder, "count", type, () => { var value = dataContext.ExecuteScalar(builder.CommandText, builder.Parameters); if (value == null && type.IsValueType) { return TypeExtensions.DefaultValue(type); } return TypeExtensions.Convert(value, type); })); } }
/// <summary> /// 绑定数据。 /// </summary> /// <param name="dataContext">数据上下文对象。</param> /// <param name="reader">数据查询读取器。</param> /// <param name="entity">当前实体对象。</param> /// <param name="field">当前字段。</param> /// <param name="type">实体中字段的类型。</param> /// <param name="cache">缓存。</param> /// <returns>返回绑定的数据。</returns> public override object Bind(IDataContext dataContext, IDataQueryReader reader, object entity, string field, Type type, IDataBinderObjectCache cache) { var elementType = type.IsArray ? type.GetElementType() : type.GetGenericArguments()[0]; bool isSingleValue = (elementType == typeof(string) || elementType.IsValueType || TypeExtensions.IsNullableType(elementType)); if (isSingleValue && (string.IsNullOrEmpty(Field) || Field == "*")) { Field = "id"; } using (var builder = dataContext.CreateSelect(SourceName)) { //PreSelectBuilder(dataContext, dataReader, entity, builder, cache); if (isSingleValue) { builder.Select(Field); } var conditiion = MapObject(Condition, dataContext, entity, reader); builder.Query(conditiion).Sort(Sorter); return(CacheFunc(cache, builder, "list", type, () => { var list = (System.Collections.IList)FastWrapper.CreateInstance(type); var q = dataContext.CreateQuery(elementType, builder.CommandText, builder.Parameters); q.DataBinderObjectCache = cache; foreach (var item in q) { list.Add(item); } if (type.IsArray) { var array = Array.CreateInstance(elementType, list.Count); list.CopyTo(array, 0); return array; } return list; })); } }
/// <summary> /// 绑定数据。 /// </summary> /// <param name="dataContext">数据上下文对象。</param> /// <param name="dataReader">数据读取对象。</param> /// <param name="entity">当前实体对象。</param> /// <param name="type">类型。</param> /// <param name="cache">缓存。</param> public static void Bind(IDataContext dataContext, System.Data.IDataReader dataReader, object entity, System.Type type, IDataBinderObjectCache cache) { if (entity == null) { return; } var list = TryGetBind(type); if (list == null || list.Count == 0) { return; } for (int i = 0; i < list.Count; i++) { list[i].Bind(dataContext, dataReader, entity, cache); } }
public void Bind(IDataContext dataContext, System.Data.IDataReader dataReader, object entity, IDataBinderObjectCache cache) { if (cache != null && binder.AllowCache) { object value; if (!cache.Get(entity, propertyInfo.Name, out value)) { value = binder.Bind(dataContext, dataReader, entity, propertyInfo.Name, propertyInfo.PropertyType, cache); cache.Set(entity, propertyInfo.Name, value); } propertyInfo.SetValue(entity, value, null); } else { var value2 = binder.Bind(dataContext, dataReader, entity, propertyInfo.Name, propertyInfo.PropertyType, cache); propertyInfo.SetValue(entity, value2, null); } }
/// <summary> /// 绑定数据。 /// </summary> /// <param name="dataContext">数据上下文对象。</param> /// <param name="dataReader">数据读取对象。</param> /// <param name="entity">当前实体对象。</param> /// <param name="field">当前字段。</param> /// <param name="type">实体中字段的类型。</param> /// <param name="cache">缓存。</param> /// <returns>返回绑定的数据。</returns> public abstract object Bind(IDataContext dataContext, System.Data.IDataReader dataReader, object entity, string field, Type type, IDataBinderObjectCache cache);
/// <summary> /// select命令构造器预处理(处理$this.xx值引用)。 /// </summary> /// <param name="dataContext">数据上下文对象。</param> /// <param name="dataReader">数据读取对象。</param> /// <param name="entity">当前实体对象。</param> /// <param name="builder">select命令构造器。</param> /// <param name="cache">缓存。</param> protected virtual void PreSelectBuilder(IDataContext dataContext, System.Data.IDataReader dataReader, object entity, Symbol.Data.ISelectCommandBuilder builder, IDataBinderObjectCache cache) { var baseAddCommandParameter = builder.AddCommandParameter; builder.AddCommandParameter = (p) => { string p10 = p as string; if (p10 != null && p10[0] == '$' && p10.Length > 1) { var value = CacheFunc(cache, entity, p10, () => { var func = GetPreSelectBuilderFunc(entity.GetType(), p10); return(func?.Invoke(dataContext, dataReader, entity)); }); //var value = GetPreSelectBuilderFunc(entity.GetType(), p10)?.Invoke(dataContext, dataReader, entity); return(baseAddCommandParameter(value)); } return(baseAddCommandParameter(p)); }; }
/// <summary> /// 绑定数据。 /// </summary> /// <param name="dataContext">数据上下文对象。</param> /// <param name="reader">数据查询读取器。</param> /// <param name="entity">当前实体对象。</param> /// <param name="field">当前字段。</param> /// <param name="type">实体中字段的类型。</param> /// <param name="cache">缓存。</param> /// <returns>返回绑定的数据。</returns> public override object Bind(IDataContext dataContext, IDataQueryReader reader, object entity, string field, Type type, IDataBinderObjectCache cache) { var list = (System.Collections.Generic.IList <string>)base.Bind(dataContext, reader, entity, field, typeof(System.Collections.Generic.List <string>), cache); #if net20 || net35 return(StringExtensions.Join(list, Spliter)); #else return(string.Join(Spliter, list)); #endif }
/// <summary> /// 绑定数据。 /// </summary> /// <param name="dataContext">数据上下文对象。</param> /// <param name="reader">数据查询读取器。</param> /// <param name="entity">当前实体对象。</param> /// <param name="field">当前字段。</param> /// <param name="type">实体中字段的类型。</param> /// <param name="cache">缓存。</param> /// <returns>返回绑定的数据。</returns> public override object Bind(IDataContext dataContext, IDataQueryReader reader, object entity, string field, Type type, IDataBinderObjectCache cache) { bool isSingleValue = (type == typeof(string) || type.IsValueType || TypeExtensions.IsNullableType(type)); if (isSingleValue && (string.IsNullOrEmpty(Field) || Field == "*")) { Field = "id"; } using (var builder = dataContext.CreateSelect(SourceName)) { //PreSelectBuilder(dataContext, dataReader, entity, builder, cache); if (isSingleValue) { builder.Select(Field); } var conditiion = MapObject(Condition, dataContext, entity, reader); builder.Query(conditiion).Sort(Sorter); return(CacheFunc(cache, builder, "once", type, () => { object value = null; if (builder.WhereCommandText.Length > 0) { var q = dataContext.CreateQuery(type, builder.CommandText, builder.Parameters); q.DataBinderObjectCache = cache; value = q.FirstOrDefault(); } if (value == null && type.IsValueType) { return TypeExtensions.DefaultValue(type); } return TypeExtensions.Convert(value, type); })); } }
/// <summary> /// 绑定数据。 /// </summary> /// <param name="dataContext">数据上下文对象。</param> /// <param name="dataReader">数据读取对象。</param> /// <param name="entity">当前实体对象。</param> /// <param name="field">当前字段。</param> /// <param name="type">实体中字段的类型。</param> /// <param name="cache">缓存。</param> /// <returns>返回绑定的数据。</returns> public override object Bind(IDataContext dataContext, System.Data.IDataReader dataReader, object entity, string field, Type type, IDataBinderObjectCache cache) { bool isSingleValue = (type == typeof(string) || type.IsValueType || TypeExtensions.IsNullableType(type)); if (isSingleValue && (string.IsNullOrEmpty(Field) || Field == "*")) Field = "id"; using (var builder = dataContext.CreateSelect(SourceName)) { PreSelectBuilder(dataContext, dataReader, entity, builder, cache); if (isSingleValue) { builder.Select(Field); } builder.Query(Condition).Sort(Sorter); return CacheFunc(cache, builder, "once", type, () => { var q = dataContext.CreateQuery(type, builder.CommandText, builder.Parameters); q.DataBinderObjectCache = cache; return TypeExtensions.Convert(q.FirstOrDefault(), type); }); } }
/// <summary> /// 绑定数据。 /// </summary> /// <param name="dataContext">数据上下文对象。</param> /// <param name="dataReader">数据读取对象。</param> /// <param name="entity">当前实体对象。</param> /// <param name="field">当前字段。</param> /// <param name="type">实体中字段的类型。</param> /// <param name="cache">缓存。</param> /// <returns>返回绑定的数据。</returns> public override object Bind(IDataContext dataContext, System.Data.IDataReader dataReader, object entity, string field, Type type, IDataBinderObjectCache cache) { var elementType = type.IsArray ? type.GetElementType() : type.GetGenericArguments()[0]; bool isSingleValue = (elementType == typeof(string) || elementType.IsValueType || TypeExtensions.IsNullableType(elementType)); if (isSingleValue && (string.IsNullOrEmpty(Field) || Field == "*")) { Field = "id"; } string fix = "__"; using (var builder = dataContext.CreateSelect(SourceName)) { PreSelectBuilder(dataContext, dataReader, entity, builder, cache); if (isSingleValue) { builder.Select(builder.PreName(new string[] { fix, Field })); } else { builder.Select(builder.PreName(fix) + ".*"); } builder.Refer(NoSQL.Refer.Begin().Refence(fix, TargetName, TargetField, SourceName, SourceField).Json()); builder.Query(Condition).Sort(Sorter); return(CacheFunc(cache, builder, "list.ref", type, () => { var q = dataContext.CreateQuery(elementType, builder.CommandText, builder.Parameters); q.DataBinderObjectCache = cache; var list = (System.Collections.IList)FastWrapper.CreateInstance(type); foreach (var item in q) { list.Add(item); } if (type.IsArray) { var array = Array.CreateInstance(elementType, list.Count); list.CopyTo(array, 0); return array; } return list; })); } }
/// <summary> /// 绑定数据。 /// </summary> /// <param name="dataContext">数据上下文对象。</param> /// <param name="reader">数据查询读取器。</param> /// <param name="entity">当前实体对象。</param> /// <param name="field">当前字段。</param> /// <param name="type">实体中字段的类型。</param> /// <param name="cache">缓存。</param> /// <returns>返回绑定的数据。</returns> public abstract object Bind(IDataContext dataContext, IDataQueryReader reader, object entity, string field, Type type, IDataBinderObjectCache cache);