diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml
index 743835e4..9c6cd88b 100644
--- a/FreeSql.DbContext/FreeSql.DbContext.xml
+++ b/FreeSql.DbContext/FreeSql.DbContext.xml
@@ -532,14 +532,5 @@
-
-
- 批量注入 Repository,可以参考代码自行调整
-
-
-
-
-
-
diff --git a/FreeSql/Internal/UtilsExpressionTree.cs b/FreeSql/Internal/UtilsExpressionTree.cs
index 83c5c442..148ac6c4 100644
--- a/FreeSql/Internal/UtilsExpressionTree.cs
+++ b/FreeSql/Internal/UtilsExpressionTree.cs
@@ -1463,7 +1463,7 @@ namespace FreeSql.Internal
var name = row2.GetName(a);
//expando[name] = row2.GetValue(a);
if (expandodic.ContainsKey(name)) continue;
- expandodic.Add(name, Utils.InternalDataReaderGetValue(_commonUtils, row2, a));
+ expandodic.Add(name, Utils.InternalDataReaderGetValue(commonUtils2, row2, a));
}
//expando = expandodic;
return new RowInfo(expandodic, fc);
@@ -1471,6 +1471,8 @@ namespace FreeSql.Internal
return dynamicFunc;// Expression.Lambda>(null);
}
+ if (type.IsAnonymousType()) return ExecuteArrayRowReadAnonymousType;
+
//类注入属性
var typetb = GetTableByEntity(type, _commonUtils);
var retExp = Expression.Variable(type, "ret");
@@ -1596,12 +1598,13 @@ namespace FreeSql.Internal
var propIndex = 0;
foreach (var prop in props)
{
- if (typetb.ColumnsByCsIgnore.ContainsKey(prop.Name))
+ if (typetb?.ColumnsByCsIgnore.ContainsKey(prop.Name) == true)
{
++propIndex;
continue;
}
- var readType = typetb.ColumnsByCs.TryGetValue(prop.Name, out var trycol) ? trycol.Attribute.MapType : prop.PropertyType;
+ ColumnInfo trycol = null;
+ var readType = typetb?.ColumnsByCs.TryGetValue(prop.Name, out trycol) == true ? trycol.Attribute.MapType : prop.PropertyType;
var ispkExp = new List();
var propGetSetMethod = prop.GetSetMethod(true);
@@ -1700,6 +1703,18 @@ namespace FreeSql.Internal
return func(typeOrg, indexes, row, dataIndex, _commonUtils);
}
+ internal static RowInfo ExecuteArrayRowReadAnonymousType(Type type2, int[] indexes2, DbDataReader row2, int dataindex2, CommonUtils commonUtils2)
+ {
+ var ctor = type2.InternalGetTypeConstructor0OrFirst();
+ var ctorParms = new object[ctor.GetParameters().Length];
+ if (indexes2?.Length != ctorParms.Length)
+ indexes2 = ctor.GetParameters().Select(c => row2.GetOrdinal(c.Name)).ToArray();
+
+ for (var c = 0; c < ctorParms.Length; c++)
+ ctorParms[c] = Utils.InternalDataReaderGetValue(commonUtils2, row2, indexes2[c]);
+ return new RowInfo(ctor.Invoke(ctorParms), ctorParms.Length);
+ }
+
internal static MethodInfo MethodExecuteArrayRowReadClassOrTuple = typeof(Utils).GetMethod("ExecuteArrayRowReadClassOrTuple", BindingFlags.Static | BindingFlags.NonPublic);
internal static MethodInfo MethodGetDataReaderValue = typeof(Utils).GetMethod("GetDataReaderValue", BindingFlags.Static | BindingFlags.NonPublic);