diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index ec78d9b4..98024e6d 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -252,7 +252,7 @@ namespace FreeSql.Internal.CommonProvider { return _orm.Cache.Shell(_cache.key, _cache.seconds, () => { List ret = new List(); _orm.Ado.ExecuteReader(_transaction, dr => { - ret.Add(af.Read(dr)); + ret.Add(af.Read(_orm, dr)); }, CommandType.Text, sql, _params.ToArray()); _orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret)); _trackToList?.Invoke(ret); @@ -267,7 +267,7 @@ namespace FreeSql.Internal.CommonProvider { return await _orm.Cache.ShellAsync(_cache.key, _cache.seconds, async () => { List ret = new List(); await _orm.Ado.ExecuteReaderAsync(_transaction, dr => { - ret.Add(af.Read(dr)); + ret.Add(af.Read(_orm, dr)); return Task.CompletedTask; }, CommandType.Text, sql, _params.ToArray()); _orm.Aop.ToList?.Invoke(this, new AopToListEventArgs(ret)); @@ -332,7 +332,7 @@ namespace FreeSql.Internal.CommonProvider { static ConcurrentDictionary _dicGetAllFieldExpressionTree = new ConcurrentDictionary(); public class GetAllFieldExpressionTreeInfo { public string Field { get; set; } - public Func Read { get; set; } + public Func Read { get; set; } } protected GetAllFieldExpressionTreeInfo GetAllFieldExpressionTree() { return _dicGetAllFieldExpressionTree.GetOrAdd(string.Join("+", _tables.Select(a => $"{_orm.Ado.DataType}-{a.Table.DbName}-{a.Alias}-{a.Type}")), s => { @@ -340,6 +340,7 @@ namespace FreeSql.Internal.CommonProvider { var type = tb1.TypeLazy ?? tb1.Type; var props = tb1.Properties; + var ormExp = Expression.Parameter(typeof(IFreeSql), "orm"); var rowExp = Expression.Parameter(typeof(DbDataReader), "row"); var returnTarget = Expression.Label(type); var retExp = Expression.Variable(type, "ret"); @@ -435,7 +436,7 @@ namespace FreeSql.Internal.CommonProvider { blockExp.Add( Expression.IfThen( Expression.NotEqual(readExpValue, Expression.Constant(null)), - Expression.Call(retExp, tb1.TypeLazySetOrm, Expression.Constant(_orm)) + Expression.Call(retExp, tb1.TypeLazySetOrm, ormExp) ) ); //将 orm 传递给 lazy blockExp.AddRange(new Expression[] { @@ -444,7 +445,7 @@ namespace FreeSql.Internal.CommonProvider { }); return new GetAllFieldExpressionTreeInfo { Field = field.ToString(), - Read = Expression.Lambda>(Expression.Block(new[] { retExp, dataIndexExp, readExp }, blockExp), new[] { rowExp }).Compile() + Read = Expression.Lambda>(Expression.Block(new[] { retExp, dataIndexExp, readExp }, blockExp), new[] { ormExp, rowExp }).Compile() }; }); }