示例#1
0
 /// <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());
     }
 }
示例#2
0
 /// <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());
     }
 }
示例#3
0
        /// <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);
                }));
            }
        }
示例#4
0
        /// <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;
                }));
            }
        }
示例#5
0
        /// <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);
            }
        }
示例#6
0
 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);
     }
 }
示例#7
0
 /// <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);
示例#8
0
        /// <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
        }
示例#10
0
        /// <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);
                }));
            }
        }
示例#11
0
        /// <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);
                });
            }
        }
示例#12
0
        /// <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;
                }));
            }
        }
示例#13
0
 /// <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);