mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 01:05:27 +08:00 
			
		
		
		
	- 优化 实体基类的属性位置,优先排在最前面; #164
- 整理 实体类 Ctor 有构造函数的映射处理;#164 [wiki](https://github.com/2881099/FreeSql/wiki/%e8%bf%94%e5%9b%9e%e6%95%b0%e6%8d%ae#dto-%E6%98%A0%E5%B0%84%E6%9F%A5%E8%AF%A2) - 优化 实体属性,支持 protected set 属性;#164
This commit is contained in:
		@@ -52,7 +52,8 @@ namespace FreeSql.Internal
 | 
			
		||||
                        var constExpValue = constExp.Value?.ToString() ?? "NULL";
 | 
			
		||||
                        if (constExpValue == string.Empty) constExpValue = _common.FormatSql("{0}", "");
 | 
			
		||||
                        parent.DbField = constExpValue;
 | 
			
		||||
                    } else
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                        parent.DbField = _common.FormatSql("{0}", constExp?.Value);
 | 
			
		||||
                    field.Append(", ").Append(parent.DbField);
 | 
			
		||||
                    if (index >= 0) field.Append(" as").Append(++index);
 | 
			
		||||
@@ -82,8 +83,8 @@ namespace FreeSql.Internal
 | 
			
		||||
                        var map = new List<SelectColumnInfo>();
 | 
			
		||||
                        ExpressionSelectColumn_MemberAccess(_tables, map, SelectTableInfoType.From, exp, true, getSelectGroupingMapString);
 | 
			
		||||
                        var tb = parent.Table = map.First().Table.Table;
 | 
			
		||||
                        parent.Consturctor = tb.Type.GetConstructor(new Type[0]);
 | 
			
		||||
                        parent.ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Properties;
 | 
			
		||||
                        parent.CsType = tb.Type;
 | 
			
		||||
                        parent.Consturctor = tb.Type.InternalGetTypeConstructor0OrFirst();
 | 
			
		||||
                        parent.IsEntity = true;
 | 
			
		||||
                        for (var idx = 0; idx < map.Count; idx++)
 | 
			
		||||
                        {
 | 
			
		||||
@@ -113,10 +114,25 @@ namespace FreeSql.Internal
 | 
			
		||||
                    return false;
 | 
			
		||||
                case ExpressionType.MemberInit:
 | 
			
		||||
                    var initExp = exp as MemberInitExpression;
 | 
			
		||||
                    parent.Consturctor = initExp.NewExpression.Type.GetConstructors()[0];
 | 
			
		||||
                    parent.ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Properties;
 | 
			
		||||
 | 
			
		||||
                    if (isAllDtoMap && _tables != null && _tables.Any() && initExp.NewExpression.Type != _tables.FirstOrDefault().Table.Type)
 | 
			
		||||
                    parent.CsType = initExp.Type;
 | 
			
		||||
                    parent.Consturctor = initExp.NewExpression.Constructor;
 | 
			
		||||
                    if (initExp.NewExpression?.Arguments.Count > 0)
 | 
			
		||||
                    {
 | 
			
		||||
                        //处理构造参数
 | 
			
		||||
                        for (var a = 0; a < initExp.NewExpression.Arguments.Count; a++)
 | 
			
		||||
                        {
 | 
			
		||||
                            var child = new ReadAnonymousTypeInfo
 | 
			
		||||
                            {
 | 
			
		||||
                                Property = null,
 | 
			
		||||
                                CsName = initExp.NewExpression.Members[a].Name,
 | 
			
		||||
                                CsType = initExp.NewExpression.Arguments[a].Type,
 | 
			
		||||
                                MapType = initExp.NewExpression.Arguments[a].Type
 | 
			
		||||
                            };
 | 
			
		||||
                            parent.Childs.Add(child);
 | 
			
		||||
                            ReadAnonymousField(_tables, field, child, ref index, initExp.NewExpression.Arguments[a], getSelectGroupingMapString, whereCascadeExpression, false);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    else if (isAllDtoMap && _tables != null && _tables.Any() && initExp.NewExpression.Type != _tables.FirstOrDefault().Table.Type)
 | 
			
		||||
                    {
 | 
			
		||||
                        //dto 映射
 | 
			
		||||
                        var dtoProps = initExp.NewExpression.Type.GetPropertiesDictIgnoreCase().Values;
 | 
			
		||||
@@ -124,26 +140,26 @@ namespace FreeSql.Internal
 | 
			
		||||
                        {
 | 
			
		||||
                            foreach (var dtTb in _tables)
 | 
			
		||||
                            {
 | 
			
		||||
                                if (dtTb.Table.Columns.TryGetValue(dtoProp.Name, out var trydtocol))
 | 
			
		||||
                                if (dtTb.Table.Columns.TryGetValue(dtoProp.Name, out var trydtocol) == false) continue;
 | 
			
		||||
                                if (trydtocol.Attribute.IsIgnore == true) continue;
 | 
			
		||||
 | 
			
		||||
                                var child = new ReadAnonymousTypeInfo
 | 
			
		||||
                                {
 | 
			
		||||
                                    var child = new ReadAnonymousTypeInfo
 | 
			
		||||
                                    {
 | 
			
		||||
                                        Property = dtoProp,
 | 
			
		||||
                                        CsName = dtoProp.Name,
 | 
			
		||||
                                        CsType = trydtocol.CsType, // dtoProp.PropertyType,
 | 
			
		||||
                                        MapType = trydtocol.Attribute.MapType
 | 
			
		||||
                                    };
 | 
			
		||||
                                    parent.Childs.Add(child);
 | 
			
		||||
                                    if (dtTb.Parameter != null)
 | 
			
		||||
                                        ReadAnonymousField(_tables, field, child, ref index, Expression.Property(dtTb.Parameter, dtTb.Table.Properties[trydtocol.CsName]), getSelectGroupingMapString, whereCascadeExpression, isAllDtoMap);
 | 
			
		||||
                                    else
 | 
			
		||||
                                    {
 | 
			
		||||
                                        child.DbField = $"{dtTb.Alias}.{_common.QuoteSqlName(trydtocol.Attribute.Name)}";
 | 
			
		||||
                                        field.Append(", ").Append(child.DbField);
 | 
			
		||||
                                        if (index >= 0) field.Append(" as").Append(++index);
 | 
			
		||||
                                    }
 | 
			
		||||
                                    break;
 | 
			
		||||
                                    Property = dtoProp,
 | 
			
		||||
                                    CsName = dtoProp.Name,
 | 
			
		||||
                                    CsType = trydtocol.CsType, // dtoProp.PropertyType,
 | 
			
		||||
                                    MapType = trydtocol.Attribute.MapType
 | 
			
		||||
                                };
 | 
			
		||||
                                parent.Childs.Add(child);
 | 
			
		||||
                                if (dtTb.Parameter != null)
 | 
			
		||||
                                    ReadAnonymousField(_tables, field, child, ref index, Expression.Property(dtTb.Parameter, dtTb.Table.Properties[trydtocol.CsName]), getSelectGroupingMapString, whereCascadeExpression, isAllDtoMap);
 | 
			
		||||
                                else
 | 
			
		||||
                                {
 | 
			
		||||
                                    child.DbField = $"{dtTb.Alias}.{_common.QuoteSqlName(trydtocol.Attribute.Name)}";
 | 
			
		||||
                                    field.Append(", ").Append(child.DbField);
 | 
			
		||||
                                    if (index >= 0) field.Append(" as").Append(++index);
 | 
			
		||||
                                }
 | 
			
		||||
                                break;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
@@ -169,15 +185,27 @@ namespace FreeSql.Internal
 | 
			
		||||
                    return true;
 | 
			
		||||
                case ExpressionType.New:
 | 
			
		||||
                    var newExp = exp as NewExpression;
 | 
			
		||||
                    parent.Consturctor = newExp.Type.GetConstructors()[0];
 | 
			
		||||
                    parent.ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Arguments;
 | 
			
		||||
                    if (newExp.Members?.Count > 0)
 | 
			
		||||
                    parent.CsType = newExp.Type;
 | 
			
		||||
                    parent.Consturctor = newExp.Constructor;
 | 
			
		||||
                    if (newExp.Arguments?.Count > 0 &&
 | 
			
		||||
                        (
 | 
			
		||||
                            newExp.Type.IsAnonymousType() ||
 | 
			
		||||
                            newExp.Arguments.Any(a =>
 | 
			
		||||
                            {
 | 
			
		||||
                                if (a.NodeType != ExpressionType.Constant) return true;
 | 
			
		||||
                                var constVal = (a as ConstantExpression)?.Value;
 | 
			
		||||
                                if (constVal == null) return true;
 | 
			
		||||
                                if (object.Equals(constVal, a.Type.CreateInstanceGetDefaultValue()) == false) return true;
 | 
			
		||||
                                return false;
 | 
			
		||||
                            })
 | 
			
		||||
                        ))
 | 
			
		||||
                    {
 | 
			
		||||
                        for (var a = 0; a < newExp.Members.Count; a++)
 | 
			
		||||
                        //处理构造参数
 | 
			
		||||
                        for (var a = 0; a < newExp.Arguments.Count; a++)
 | 
			
		||||
                        {
 | 
			
		||||
                            var child = new ReadAnonymousTypeInfo
 | 
			
		||||
                            {
 | 
			
		||||
                                Property = newExp.Type.GetProperty(newExp.Members[a].Name, BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance),
 | 
			
		||||
                                Property = null,
 | 
			
		||||
                                CsName = newExp.Members[a].Name,
 | 
			
		||||
                                CsType = newExp.Arguments[a].Type,
 | 
			
		||||
                                MapType = newExp.Arguments[a].Type
 | 
			
		||||
@@ -188,37 +216,37 @@ namespace FreeSql.Internal
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        parent.IsDefaultCtor = true;
 | 
			
		||||
                        //dto 映射
 | 
			
		||||
                        parent.ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Properties;
 | 
			
		||||
                        var dtoProps2 = newExp.Type.GetPropertiesDictIgnoreCase().Values;
 | 
			
		||||
                        foreach (var dtoProp in dtoProps2)
 | 
			
		||||
                        {
 | 
			
		||||
                            foreach (var dtTb in _tables)
 | 
			
		||||
                            {
 | 
			
		||||
                                if (dtTb.Table.ColumnsByCs.TryGetValue(dtoProp.Name, out var trydtocol))
 | 
			
		||||
                                if (dtTb.Table.ColumnsByCs.TryGetValue(dtoProp.Name, out var trydtocol) == false) continue;
 | 
			
		||||
                                if (trydtocol.Attribute.IsIgnore == true) continue;
 | 
			
		||||
 | 
			
		||||
                                var child = new ReadAnonymousTypeInfo
 | 
			
		||||
                                {
 | 
			
		||||
                                    var child = new ReadAnonymousTypeInfo
 | 
			
		||||
                                    {
 | 
			
		||||
                                        Property = dtoProp,
 | 
			
		||||
                                        CsName = dtoProp.Name,
 | 
			
		||||
                                        CsType = trydtocol.CsType, //dtoProp.PropertyType,
 | 
			
		||||
                                        MapType = trydtocol.Attribute.MapType
 | 
			
		||||
                                    };
 | 
			
		||||
                                    parent.Childs.Add(child);
 | 
			
		||||
                                    if (dtTb.Parameter != null)
 | 
			
		||||
                                        ReadAnonymousField(_tables, field, child, ref index, Expression.Property(dtTb.Parameter, dtTb.Table.Properties[trydtocol.CsName]), getSelectGroupingMapString, whereCascadeExpression, isAllDtoMap);
 | 
			
		||||
                                    else
 | 
			
		||||
                                    {
 | 
			
		||||
                                        child.DbField = $"{dtTb.Alias}.{_common.QuoteSqlName(trydtocol.Attribute.Name)}";
 | 
			
		||||
                                        field.Append(", ").Append(child.DbField);
 | 
			
		||||
                                        if (index >= 0) field.Append(" as").Append(++index);
 | 
			
		||||
                                    }
 | 
			
		||||
                                    break;
 | 
			
		||||
                                    Property = dtoProp,
 | 
			
		||||
                                    CsName = dtoProp.Name,
 | 
			
		||||
                                    CsType = trydtocol.CsType, //dtoProp.PropertyType,
 | 
			
		||||
                                    MapType = trydtocol.Attribute.MapType
 | 
			
		||||
                                };
 | 
			
		||||
                                parent.Childs.Add(child);
 | 
			
		||||
                                if (dtTb.Parameter != null)
 | 
			
		||||
                                    ReadAnonymousField(_tables, field, child, ref index, Expression.Property(dtTb.Parameter, dtTb.Table.Properties[trydtocol.CsName]), getSelectGroupingMapString, whereCascadeExpression, isAllDtoMap);
 | 
			
		||||
                                else
 | 
			
		||||
                                {
 | 
			
		||||
                                    child.DbField = $"{dtTb.Alias}.{_common.QuoteSqlName(trydtocol.Attribute.Name)}";
 | 
			
		||||
                                    field.Append(", ").Append(child.DbField);
 | 
			
		||||
                                    if (index >= 0) field.Append(" as").Append(++index);
 | 
			
		||||
                                }
 | 
			
		||||
                                break;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                        if (parent.Childs.Any() == false) throw new Exception($"映射异常:{newExp.Type.Name} 没有一个属性名相同");
 | 
			
		||||
                    }
 | 
			
		||||
                    if (parent.Childs.Any() == false) throw new Exception($"映射异常:{newExp.Type.Name} 没有一个属性名相同");
 | 
			
		||||
                    return true;
 | 
			
		||||
            }
 | 
			
		||||
            parent.DbField = $"({ExpressionLambdaToSql(exp, getTSC())})";
 | 
			
		||||
@@ -247,33 +275,30 @@ namespace FreeSql.Internal
 | 
			
		||||
                    objval = Utils.GetDataReaderValue(parent.Property.PropertyType, objval);
 | 
			
		||||
                return objval;
 | 
			
		||||
            }
 | 
			
		||||
            switch (parent.ConsturctorType)
 | 
			
		||||
            var ctorParmsLength = 0;
 | 
			
		||||
            object ret;
 | 
			
		||||
            if (parent.IsDefaultCtor || parent.IsEntity || (ctorParmsLength = parent.Consturctor.GetParameters()?.Length ?? 0) == 0)
 | 
			
		||||
                ret = parent.CsType?.CreateInstanceGetDefaultValue() ?? parent.Consturctor.Invoke(null);
 | 
			
		||||
            else
 | 
			
		||||
            {
 | 
			
		||||
                case ReadAnonymousTypeInfoConsturctorType.Arguments:
 | 
			
		||||
                    var args = new object[parent.Childs.Count];
 | 
			
		||||
                    for (var a = 0; a < parent.Childs.Count; a++)
 | 
			
		||||
                    {
 | 
			
		||||
                        var objval = ReadAnonymous(parent.Childs[a], dr, ref index, notRead, null);
 | 
			
		||||
                        if (notRead == false)
 | 
			
		||||
                            args[a] = objval;
 | 
			
		||||
                    }
 | 
			
		||||
                    return parent.Consturctor.Invoke(args);
 | 
			
		||||
                case ReadAnonymousTypeInfoConsturctorType.Properties:
 | 
			
		||||
                    var ret = parent.Consturctor.Invoke(null);
 | 
			
		||||
                    var isnull = notRead;
 | 
			
		||||
                    for (var b = 0; b < parent.Childs.Count; b++)
 | 
			
		||||
                    {
 | 
			
		||||
                        var prop = parent.Childs[b].Property;
 | 
			
		||||
                        var dbval = parent.IsEntity ? new ReadAnonymousDbValueRef() : null;
 | 
			
		||||
                        var objval = ReadAnonymous(parent.Childs[b], dr, ref index, notRead, dbval);
 | 
			
		||||
                        if (isnull == false && parent.IsEntity && dbval.DbValue == null && parent.Table != null && parent.Table.ColumnsByCs.TryGetValue(parent.Childs[b].CsName, out var trycol) && trycol.Attribute.IsPrimary)
 | 
			
		||||
                            isnull = true;
 | 
			
		||||
                        if (isnull == false && prop.CanWrite)
 | 
			
		||||
                            prop.SetValue(ret, objval, null);
 | 
			
		||||
                    }
 | 
			
		||||
                    return isnull ? null : ret;
 | 
			
		||||
                var ctorParms = new object[ctorParmsLength];
 | 
			
		||||
                for (var c = 0; c < ctorParmsLength; c++)
 | 
			
		||||
                    ctorParms[c] = ReadAnonymous(parent.Childs[c], dr, ref index, notRead, null);
 | 
			
		||||
                ret = parent.Consturctor.Invoke(ctorParms);
 | 
			
		||||
            }
 | 
			
		||||
            return null;
 | 
			
		||||
 | 
			
		||||
            var isnull = notRead;
 | 
			
		||||
            for (var b = ctorParmsLength; b < parent.Childs.Count; b++)
 | 
			
		||||
            {
 | 
			
		||||
                var prop = parent.Childs[b].Property;
 | 
			
		||||
                var dbval = parent.IsEntity ? new ReadAnonymousDbValueRef() : null;
 | 
			
		||||
                var objval = ReadAnonymous(parent.Childs[b], dr, ref index, notRead, dbval);
 | 
			
		||||
                if (isnull == false && parent.IsEntity && dbval.DbValue == null && parent.Table != null && parent.Table.ColumnsByCs.TryGetValue(parent.Childs[b].CsName, out var trycol) && trycol.Attribute.IsPrimary)
 | 
			
		||||
                    isnull = true;
 | 
			
		||||
                if (isnull == false && prop.CanWrite)
 | 
			
		||||
                    prop.SetValue(ret, objval, null);
 | 
			
		||||
            }
 | 
			
		||||
            return isnull ? null : ret;
 | 
			
		||||
        }
 | 
			
		||||
        public class ReadAnonymousDbValueRef
 | 
			
		||||
        {
 | 
			
		||||
 
 | 
			
		||||
@@ -546,7 +546,6 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
            _commonExpression.ReadAnonymousField(_tables, field, map, ref index, newexp, null, _whereCascadeExpression, true);
 | 
			
		||||
            return (map, field.Length > 0 ? field.Remove(0, 2).ToString() : null);
 | 
			
		||||
        }
 | 
			
		||||
        static ConcurrentDictionary<Type, ConstructorInfo> _dicConstructor = new ConcurrentDictionary<Type, ConstructorInfo>();
 | 
			
		||||
        static ConcurrentDictionary<string, GetAllFieldExpressionTreeInfo> _dicGetAllFieldExpressionTree = new ConcurrentDictionary<string, GetAllFieldExpressionTreeInfo>();
 | 
			
		||||
        public class GetAllFieldExpressionTreeInfo
 | 
			
		||||
        {
 | 
			
		||||
@@ -568,9 +567,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                var readExpValue = Expression.MakeMemberAccess(readExp, Utils.RowInfo.PropertyValue);
 | 
			
		||||
                var readExpDataIndex = Expression.MakeMemberAccess(readExp, Utils.RowInfo.PropertyDataIndex);
 | 
			
		||||
                var blockExp = new List<Expression>();
 | 
			
		||||
                var ctor = type.GetConstructor(new Type[0]) ?? type.GetConstructors().First();
 | 
			
		||||
                blockExp.AddRange(new Expression[] {
 | 
			
		||||
                    Expression.Assign(retExp, Expression.New(ctor, ctor.GetParameters().Select(a => Expression.Default(a.ParameterType)))),
 | 
			
		||||
                    Expression.Assign(retExp, type.InternalNewExpression()),
 | 
			
		||||
                    Expression.Assign(dataIndexExp, Expression.Constant(0))
 | 
			
		||||
                });
 | 
			
		||||
                //typeof(Topic).GetMethod("get_Type").IsVirtual
 | 
			
		||||
@@ -711,9 +709,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                var readExpValue = Expression.MakeMemberAccess(readExp, Utils.RowInfo.PropertyValue);
 | 
			
		||||
                var readExpDataIndex = Expression.MakeMemberAccess(readExp, Utils.RowInfo.PropertyDataIndex);
 | 
			
		||||
                var blockExp = new List<Expression>();
 | 
			
		||||
                var ctor = type.GetConstructor(new Type[0]) ?? type.GetConstructors().First();
 | 
			
		||||
                blockExp.AddRange(new Expression[] {
 | 
			
		||||
                    Expression.Assign(retExp, Expression.New(ctor, ctor.GetParameters().Select(a => Expression.Default(a.ParameterType)))),
 | 
			
		||||
                    Expression.Assign(retExp, type.InternalNewExpression()),
 | 
			
		||||
                    Expression.Assign(dataIndexExp, Expression.Constant(0))
 | 
			
		||||
                });
 | 
			
		||||
                //typeof(Topic).GetMethod("get_Type").IsVirtual
 | 
			
		||||
@@ -762,7 +759,7 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    //只读到二级属性
 | 
			
		||||
                    var propGetSetMethod = prop.GetSetMethod();
 | 
			
		||||
                    var propGetSetMethod = prop.GetSetMethod(true);
 | 
			
		||||
                    Expression readExpAssign = null; //加速缓存
 | 
			
		||||
                    if (prop.PropertyType.IsArray) readExpAssign = Expression.New(Utils.RowInfo.Constructor,
 | 
			
		||||
                        Utils.GetDataReaderValueBlockExpression(prop.PropertyType, Expression.Call(rowExp, Utils.MethodDataReaderGetValue, dataIndexExp)),
 | 
			
		||||
@@ -836,9 +833,9 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        protected (ReadAnonymousTypeInfo map, string field) GetAllFieldReflection()
 | 
			
		||||
        {
 | 
			
		||||
            var tb1 = _tables.First().Table;
 | 
			
		||||
            var type = tb1.Type;
 | 
			
		||||
            var constructor = _dicConstructor.GetOrAdd(type, s => type.GetConstructor(new Type[0]));
 | 
			
		||||
            var map = new ReadAnonymousTypeInfo { Consturctor = constructor, ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Properties };
 | 
			
		||||
            var type = tb1.TypeLazy ?? tb1.Type;
 | 
			
		||||
            var constructor = type.InternalGetTypeConstructor0OrFirst();
 | 
			
		||||
            var map = new ReadAnonymousTypeInfo { CsType = type, Consturctor = constructor, IsEntity = true };
 | 
			
		||||
 | 
			
		||||
            var field = new StringBuilder();
 | 
			
		||||
            var dicfield = new Dictionary<string, bool>();
 | 
			
		||||
@@ -862,8 +859,9 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                    var tb2 = _tables.Where(a => a.Table.Type == p.PropertyType && a.Alias.Contains(p.Name)).FirstOrDefault();
 | 
			
		||||
                    if (tb2 == null && ps.Where(pw => pw.Value.PropertyType == p.PropertyType).Count() == 1) tb2 = _tables.Where(a => a.Table.Type == p.PropertyType).FirstOrDefault();
 | 
			
		||||
                    if (tb2 == null) continue;
 | 
			
		||||
                    child.Consturctor = tb2.Table.Type.GetConstructor(new Type[0]);
 | 
			
		||||
                    child.ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Properties;
 | 
			
		||||
                    child.CsType = (tb2.Table.TypeLazy ?? tb2.Table.Type);
 | 
			
		||||
                    child.Consturctor = child.CsType.InternalGetTypeConstructor0OrFirst();
 | 
			
		||||
                    child.IsEntity = true;
 | 
			
		||||
                    foreach (var col2 in tb2.Table.Columns.Values)
 | 
			
		||||
                    {
 | 
			
		||||
                        if (index > 0) field.Append(", ");
 | 
			
		||||
 
 | 
			
		||||
@@ -101,8 +101,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>.ToList<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            var ctor = typeof(TDto).GetConstructor(new Type[0]);
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TDto>>(Expression.New(ctor),
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
 
 | 
			
		||||
@@ -172,8 +172,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        public List<TDto> ToList<TDto>() => ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            var ctor = typeof(TDto).GetConstructor(new Type[0]);
 | 
			
		||||
            return Expression.Lambda<Func<T1, TDto>>(Expression.New(ctor),
 | 
			
		||||
            return Expression.Lambda<Func<T1, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
@@ -884,8 +884,9 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
                            {
 | 
			
		||||
                                var field = new StringBuilder();
 | 
			
		||||
                                var read = new ReadAnonymousTypeInfo();
 | 
			
		||||
                                read.ConsturctorType = ReadAnonymousTypeInfoConsturctorType.Properties;
 | 
			
		||||
                                read.Consturctor = (tbrefMid.TypeLazy ?? tbrefMid.Type).GetConstructor(new Type[0]);
 | 
			
		||||
                                read.CsType = (tbrefMid.TypeLazy ?? tbrefMid.Type);
 | 
			
		||||
                                read.Consturctor = read.CsType.InternalGetTypeConstructor0OrFirst();
 | 
			
		||||
                                read.IsEntity = true;
 | 
			
		||||
                                read.Table = tbrefMid;
 | 
			
		||||
                                foreach (var col in tbrefMid.Columns.Values)
 | 
			
		||||
                                {
 | 
			
		||||
 
 | 
			
		||||
@@ -86,8 +86,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        List<TDto> ISelect<T1, T2>.ToList<TDto>() => (this as ISelect<T1, T2>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            var ctor = typeof(TDto).GetConstructor(new Type[0]);
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, TDto>>(Expression.New(ctor),
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"));
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -88,8 +88,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3>.ToList<TDto>() => (this as ISelect<T1, T2, T3>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            var ctor = typeof(TDto).GetConstructor(new Type[0]);
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, TDto>>(Expression.New(ctor),
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"));
 | 
			
		||||
 
 | 
			
		||||
@@ -90,8 +90,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3, T4>.ToList<TDto>() => (this as ISelect<T1, T2, T3, T4>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            var ctor = typeof(TDto).GetConstructor(new Type[0]);
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, TDto>>(Expression.New(ctor),
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
 
 | 
			
		||||
@@ -92,8 +92,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3, T4, T5>.ToList<TDto>() => (this as ISelect<T1, T2, T3, T4, T5>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, T5, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            var ctor = typeof(TDto).GetConstructor(new Type[0]);
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, TDto>>(Expression.New(ctor),
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
 
 | 
			
		||||
@@ -94,8 +94,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3, T4, T5, T6>.ToList<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, T5, T6, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            var ctor = typeof(TDto).GetConstructor(new Type[0]);
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, TDto>>(Expression.New(ctor),
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
 
 | 
			
		||||
@@ -96,8 +96,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7>.ToList<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, T5, T6, T7, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            var ctor = typeof(TDto).GetConstructor(new Type[0]);
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, TDto>>(Expression.New(ctor),
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
 
 | 
			
		||||
@@ -99,8 +99,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            var ctor = typeof(TDto).GetConstructor(new Type[0]);
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, T8, TDto>>(Expression.New(ctor),
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, T8, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
 
 | 
			
		||||
@@ -99,8 +99,8 @@ namespace FreeSql.Internal.CommonProvider
 | 
			
		||||
        List<TDto> ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>.ToList<TDto>() => (this as ISelect<T1, T2, T3, T4, T5, T6, T7, T8, T9>).ToList(GetToListDtoSelector<TDto>());
 | 
			
		||||
        Expression<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TDto>> GetToListDtoSelector<TDto>()
 | 
			
		||||
        {
 | 
			
		||||
            var ctor = typeof(TDto).GetConstructor(new Type[0]);
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TDto>>(Expression.New(ctor),
 | 
			
		||||
            return Expression.Lambda<Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, TDto>>(
 | 
			
		||||
                typeof(TDto).InternalNewExpression(),
 | 
			
		||||
                _tables[0].Parameter ?? Expression.Parameter(typeof(T1), "a"),
 | 
			
		||||
                Expression.Parameter(typeof(T2), "b"),
 | 
			
		||||
                Expression.Parameter(typeof(T3), "c"),
 | 
			
		||||
 
 | 
			
		||||
@@ -13,10 +13,9 @@ namespace FreeSql.Internal.Model
 | 
			
		||||
        public Type MapType { get; set; }
 | 
			
		||||
        public string DbField { get; set; }
 | 
			
		||||
        public ConstructorInfo Consturctor { get; set; }
 | 
			
		||||
        public ReadAnonymousTypeInfoConsturctorType ConsturctorType { get; set; }
 | 
			
		||||
        public List<ReadAnonymousTypeInfo> Childs = new List<ReadAnonymousTypeInfo>();
 | 
			
		||||
        public TableInfo Table { get; set; }
 | 
			
		||||
        public bool IsEntity { get; set; }
 | 
			
		||||
        public bool IsDefaultCtor { get; set; }
 | 
			
		||||
    }
 | 
			
		||||
    public enum ReadAnonymousTypeInfoConsturctorType { Arguments, Properties }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -72,7 +72,7 @@ namespace FreeSql.Internal
 | 
			
		||||
            var columnsList = new List<ColumnInfo>();
 | 
			
		||||
            foreach (var p in trytb.Properties.Values)
 | 
			
		||||
            {
 | 
			
		||||
                var setMethod = p.GetSetMethod(); //trytb.Type.GetMethod($"set_{p.Name}");
 | 
			
		||||
                var setMethod = p.GetSetMethod(true); //trytb.Type.GetMethod($"set_{p.Name}");
 | 
			
		||||
                var colattr = common.GetEntityColumnAttribute(entity, p);
 | 
			
		||||
                var tp = common.CodeFirst.GetDbInfo(colattr?.MapType ?? p.PropertyType);
 | 
			
		||||
                if (setMethod == null || (tp == null && p.PropertyType.IsValueType)) // 属性没有 set自动忽略
 | 
			
		||||
@@ -1200,7 +1200,7 @@ namespace FreeSql.Internal
 | 
			
		||||
                this.Value = value;
 | 
			
		||||
                this.DataIndex = dataIndex;
 | 
			
		||||
            }
 | 
			
		||||
            public static ConstructorInfo Constructor = typeof(RowInfo).GetConstructor(new[] { typeof(object), typeof(int) });
 | 
			
		||||
            public static ConstructorInfo Constructor = typeof(RowInfo). GetConstructor(new[] { typeof(object), typeof(int) });
 | 
			
		||||
            public static PropertyInfo PropertyValue = typeof(RowInfo).GetProperty("Value");
 | 
			
		||||
            public static PropertyInfo PropertyDataIndex = typeof(RowInfo).GetProperty("DataIndex");
 | 
			
		||||
        }
 | 
			
		||||
@@ -1342,14 +1342,15 @@ namespace FreeSql.Internal
 | 
			
		||||
                    var readpkvalExp = Expression.Variable(typeof(object), "isnull3val");
 | 
			
		||||
                    var indexesLengthExp = Expression.Variable(typeof(int), "indexesLength");
 | 
			
		||||
                    var blockExp = new List<Expression>();
 | 
			
		||||
                    var ctor = type.GetConstructor(new Type[0]) ?? type.GetConstructors().First();
 | 
			
		||||
                    var ctorParms = ctor.GetParameters();
 | 
			
		||||
                    if (ctorParms.Length > 0)
 | 
			
		||||
                    var newExp = type.InternalNewExpression();
 | 
			
		||||
                    if (false && newExp.Arguments.Count > 0)
 | 
			
		||||
                    {
 | 
			
		||||
                        #region 按构造参数读取数据,此功能暂时关闭
 | 
			
		||||
                        /*
 | 
			
		||||
                        blockExp.AddRange(new Expression[] {
 | 
			
		||||
                        Expression.Assign(readpknullExp, Expression.Constant(false))
 | 
			
		||||
                    });
 | 
			
		||||
                        foreach (var ctorParm in ctorParms)
 | 
			
		||||
                            Expression.Assign(readpknullExp, Expression.Constant(false))
 | 
			
		||||
                        });
 | 
			
		||||
                        foreach (var ctorParm in newExp.Constructor.GetParameters())
 | 
			
		||||
                        {
 | 
			
		||||
                            if (typetb.ColumnsByCsIgnore.ContainsKey(ctorParm.Name)) continue;
 | 
			
		||||
                            var readType = typetb.ColumnsByCs.TryGetValue(ctorParm.Name, out var trycol) ? trycol.Attribute.MapType : ctorParm.ParameterType;
 | 
			
		||||
@@ -1419,33 +1420,35 @@ namespace FreeSql.Internal
 | 
			
		||||
                            );
 | 
			
		||||
 | 
			
		||||
                            blockExp.AddRange(new Expression[] {
 | 
			
		||||
                            Expression.Assign(tryidxExp, dataIndexExp),
 | 
			
		||||
                            readVal,
 | 
			
		||||
                            Expression.Assign(readExp, readExpAssign),
 | 
			
		||||
                            Expression.IfThen(Expression.GreaterThan(readExpDataIndex, dataIndexExp),
 | 
			
		||||
                                Expression.Assign(dataIndexExp, readExpDataIndex)
 | 
			
		||||
                            ),
 | 
			
		||||
                            Expression.Block(ispkExp)
 | 
			
		||||
                        });
 | 
			
		||||
                                Expression.Assign(tryidxExp, dataIndexExp),
 | 
			
		||||
                                readVal,
 | 
			
		||||
                                Expression.Assign(readExp, readExpAssign),
 | 
			
		||||
                                Expression.IfThen(Expression.GreaterThan(readExpDataIndex, dataIndexExp),
 | 
			
		||||
                                    Expression.Assign(dataIndexExp, readExpDataIndex)
 | 
			
		||||
                                ),
 | 
			
		||||
                                Expression.Block(ispkExp)
 | 
			
		||||
                            });
 | 
			
		||||
                        }
 | 
			
		||||
                        blockExp.Add(
 | 
			
		||||
                            Expression.IfThen(
 | 
			
		||||
                                Expression.IsFalse(readpknullExp),
 | 
			
		||||
                                Expression.Assign(retExp, Expression.New(ctor, readExpValueParms))
 | 
			
		||||
                                Expression.Assign(retExp, Expression.New(newExp.Constructor, readExpValueParms))
 | 
			
		||||
                            )
 | 
			
		||||
                        );
 | 
			
		||||
                        */
 | 
			
		||||
                        #endregion
 | 
			
		||||
                    }
 | 
			
		||||
                    else
 | 
			
		||||
                    {
 | 
			
		||||
                        blockExp.AddRange(new Expression[] {
 | 
			
		||||
                        Expression.Assign(retExp, Expression.New(ctor)),
 | 
			
		||||
                        Expression.Assign(indexesLengthExp, Expression.Constant(0)),
 | 
			
		||||
                        Expression.IfThen(
 | 
			
		||||
                            Expression.NotEqual(indexesExp, Expression.Constant(null)),
 | 
			
		||||
                            Expression.Assign(indexesLengthExp, Expression.ArrayLength(indexesExp))
 | 
			
		||||
                        ),
 | 
			
		||||
                        Expression.Assign(readpknullExp, Expression.Constant(false))
 | 
			
		||||
                    });
 | 
			
		||||
                            Expression.Assign(retExp, newExp),
 | 
			
		||||
                            Expression.Assign(indexesLengthExp, Expression.Constant(0)),
 | 
			
		||||
                            Expression.IfThen(
 | 
			
		||||
                                Expression.NotEqual(indexesExp, Expression.Constant(null)),
 | 
			
		||||
                                Expression.Assign(indexesLengthExp, Expression.ArrayLength(indexesExp))
 | 
			
		||||
                            ),
 | 
			
		||||
                            Expression.Assign(readpknullExp, Expression.Constant(false))
 | 
			
		||||
                        });
 | 
			
		||||
 | 
			
		||||
                        var props = type.GetPropertiesDictIgnoreCase().Values;
 | 
			
		||||
                        var propIndex = 0;
 | 
			
		||||
@@ -1459,7 +1462,7 @@ namespace FreeSql.Internal
 | 
			
		||||
                            var readType = typetb.ColumnsByCs.TryGetValue(prop.Name, out var trycol) ? trycol.Attribute.MapType : prop.PropertyType;
 | 
			
		||||
 | 
			
		||||
                            var ispkExp = new List<Expression>();
 | 
			
		||||
                            var propGetSetMethod = prop.GetSetMethod();
 | 
			
		||||
                            var propGetSetMethod = prop.GetSetMethod(true);
 | 
			
		||||
                            Expression readVal = Expression.Assign(readpkvalExp, Expression.Call(rowExp, MethodDataReaderGetValue, tryidxExp));
 | 
			
		||||
                            Expression readExpAssign = null; //加速缓存
 | 
			
		||||
                            if (readType.IsArray) readExpAssign = Expression.New(RowInfo.Constructor,
 | 
			
		||||
@@ -1524,30 +1527,30 @@ namespace FreeSql.Internal
 | 
			
		||||
                                )
 | 
			
		||||
                            );
 | 
			
		||||
                            blockExp.AddRange(new Expression[] {
 | 
			
		||||
							//以下注释部分为【严格读取】,会损失一点性能,使用 select * from xxx 与属性映射赋值
 | 
			
		||||
							Expression.IfThenElse(
 | 
			
		||||
                                Expression.LessThan(Expression.Constant(propIndex), indexesLengthExp),
 | 
			
		||||
                                Expression.Assign(tryidxExp, Expression.ArrayAccess(indexesExp, Expression.Constant(propIndex))),
 | 
			
		||||
                                Expression.Assign(tryidxExp, dataIndexExp)
 | 
			
		||||
                            ),
 | 
			
		||||
                            Expression.IfThen(
 | 
			
		||||
                                Expression.GreaterThanOrEqual(tryidxExp, Expression.Constant(0)),
 | 
			
		||||
                                Expression.Block(
 | 
			
		||||
                                    readVal,
 | 
			
		||||
                                    Expression.Assign(readExp, readExpAssign),
 | 
			
		||||
                                    Expression.IfThen(Expression.GreaterThan(readExpDataIndex, dataIndexExp),
 | 
			
		||||
                                        Expression.Assign(dataIndexExp, readExpDataIndex)),
 | 
			
		||||
                                    Expression.Block(ispkExp)
 | 
			
		||||
							    //以下注释部分为【严格读取】,会损失一点性能,使用 select * from xxx 与属性映射赋值
 | 
			
		||||
							    Expression.IfThenElse(
 | 
			
		||||
                                    Expression.LessThan(Expression.Constant(propIndex), indexesLengthExp),
 | 
			
		||||
                                    Expression.Assign(tryidxExp, Expression.ArrayAccess(indexesExp, Expression.Constant(propIndex))),
 | 
			
		||||
                                    Expression.Assign(tryidxExp, dataIndexExp)
 | 
			
		||||
                                ),
 | 
			
		||||
                                Expression.IfThen(
 | 
			
		||||
                                    Expression.GreaterThanOrEqual(tryidxExp, Expression.Constant(0)),
 | 
			
		||||
                                    Expression.Block(
 | 
			
		||||
                                        readVal,
 | 
			
		||||
                                        Expression.Assign(readExp, readExpAssign),
 | 
			
		||||
                                        Expression.IfThen(Expression.GreaterThan(readExpDataIndex, dataIndexExp),
 | 
			
		||||
                                            Expression.Assign(dataIndexExp, readExpDataIndex)),
 | 
			
		||||
                                        Expression.Block(ispkExp)
 | 
			
		||||
                                    )
 | 
			
		||||
                                )
 | 
			
		||||
                            )
 | 
			
		||||
                        });
 | 
			
		||||
                            });
 | 
			
		||||
                            ++propIndex;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    blockExp.AddRange(new Expression[] {
 | 
			
		||||
                    Expression.Return(returnTarget, Expression.New(RowInfo.Constructor, retExp, dataIndexExp)),
 | 
			
		||||
                    Expression.Label(returnTarget, Expression.Default(typeof(RowInfo)))
 | 
			
		||||
                });
 | 
			
		||||
                        Expression.Return(returnTarget, Expression.New(RowInfo.Constructor, retExp, dataIndexExp)),
 | 
			
		||||
                        Expression.Label(returnTarget, Expression.Default(typeof(RowInfo)))
 | 
			
		||||
                    });
 | 
			
		||||
                    return Expression.Lambda<Func<Type, int[], DbDataReader, int, CommonUtils, RowInfo>>(
 | 
			
		||||
                        Expression.Block(new[] { retExp, readExp, tryidxExp, readpknullExp, readpkvalExp, readExpsIndex, indexesLengthExp }.Concat(readExpValueParms), blockExp), new[] { typeExp, indexesExp, rowExp, dataIndexExp, commonUtilExp }).Compile();
 | 
			
		||||
                });
 | 
			
		||||
@@ -1616,7 +1619,7 @@ namespace FreeSql.Internal
 | 
			
		||||
        static MethodInfo MethodBigIntegerParse = typeof(Utils).GetMethod("ToBigInteger", BindingFlags.NonPublic | BindingFlags.Static, null, new[] { typeof(string) }, null);
 | 
			
		||||
        static PropertyInfo PropertyDateTimeOffsetDateTime = typeof(DateTimeOffset).GetProperty("DateTime", BindingFlags.Instance | BindingFlags.Public);
 | 
			
		||||
        static PropertyInfo PropertyDateTimeTicks = typeof(DateTime).GetProperty("Ticks", BindingFlags.Instance | BindingFlags.Public);
 | 
			
		||||
        static ConstructorInfo CtorDateTimeOffsetArgsTicks = typeof(DateTimeOffset).GetConstructor(new[] { typeof(long), typeof(TimeSpan) });
 | 
			
		||||
        static ConstructorInfo CtorDateTimeOffsetArgsTicks = typeof(DateTimeOffset). GetConstructor(new[] { typeof(long), typeof(TimeSpan) });
 | 
			
		||||
 | 
			
		||||
        public static ConcurrentBag<Func<LabelTarget, Expression, Type, Expression>> GetDataReaderValueBlockExpressionSwitchTypeFullName = new ConcurrentBag<Func<LabelTarget, Expression, Type, Expression>>();
 | 
			
		||||
        public static ConcurrentBag<Func<LabelTarget, Expression, Expression, Type, Expression>> GetDataReaderValueBlockExpressionObjectToStringIfThenElse = new ConcurrentBag<Func<LabelTarget, Expression, Expression, Type, Expression>>();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user