public override void SchemaCompleted() { toStrGetterExpression = ToStringExpressionVisitor.GetToString <T>(this.Constructor, s => s.ToString()); toStrGetter = toStrGetterExpression.Compile(); if (this.subTables != null) { foreach (var item in this.subTables) { item.SchemaCompleted(); } } }
public static Expression <Func <PrimaryKey, string> > GetToString <T>(CachedTableConstructor constructor, Expression <Func <T, string> > lambda) { Table table = (Table)constructor.table; var param = lambda.Parameters.SingleEx(); if (param.Type != table.Type) { throw new InvalidOperationException("incorrect lambda paramer type"); } var pk = Expression.Parameter(typeof(PrimaryKey), "pk"); var root = new CachedEntityExpression(pk, typeof(T), constructor, null, null); var visitor = new ToStringExpressionVisitor(param, root); var result = visitor.Visit(lambda.Body); return(Expression.Lambda <Func <PrimaryKey, string> >(result, pk)); }
public static Expression GetToString(Table table, ParameterExpression reader, List <IColumn> columns) { LambdaExpression lambda = ExpressionCleaner.GetFieldExpansion(table.Type, CachedTableBase.ToStringMethod) !; if (lambda == null) { columns.Add(table.ToStrColumn !); return(FieldReader.GetExpression(reader, columns.Count - 1, typeof(string))); } ToStringExpressionVisitor toStr = new ToStringExpressionVisitor( lambda.Parameters.SingleEx(), reader, columns, table ); var result = toStr.Visit(lambda.Body); return(result); }
public override void SchemaCompleted() { List <IColumn> columns = new List <IColumn> { table.PrimaryKey }; ParameterExpression reader = Expression.Parameter(typeof(FieldReader)); var expression = ToStringExpressionVisitor.GetToString(table, reader, columns); //Query using (ObjectName.OverrideOptions(new ObjectNameOptions { AvoidDatabaseName = true })) { string select = "SELECT {0}\r\nFROM {1} {2}\r\n".FormatWith( columns.ToString(c => currentAlias + "." + c.Name.SqlEscape(), ", "), table.Name.ToString(), currentAlias.ToString()); select += this.lastPartialJoin + currentAlias + "." + table.PrimaryKey.Name.SqlEscape() + "\r\n" + this.remainingJoins; query = new SqlPreCommandSimple(select); } //Reader { var kvpConstructor = Expression.New(CachedTableConstructor.ciKVPIntString, CachedTableConstructor.NewPrimaryKey(FieldReader.GetExpression(reader, 0, this.table.PrimaryKey.Type)), expression); rowReader = Expression.Lambda <Func <FieldReader, KeyValuePair <PrimaryKey, string> > >(kvpConstructor, reader).Compile(); } toStrings = new ResetLazy <Dictionary <PrimaryKey, string> >(() => { CacheLogic.AssertSqlDependencyStarted(); var connector = (SqlConnector)Connector.Current; var subConnector = connector.ForDatabase(table.Name.Schema?.Database); Dictionary <PrimaryKey, string> result = new Dictionary <PrimaryKey, string>(); using (MeasureLoad()) using (Connector.Override(subConnector)) using (Transaction tr = Transaction.ForceNew(IsolationLevel.ReadCommitted)) { if (CacheLogic.LogWriter != null) { CacheLogic.LogWriter.WriteLine("Load {0}".FormatWith(GetType().TypeName())); } ((SqlConnector)Connector.Current).ExecuteDataReaderOptionalDependency(query, OnChange, fr => { var kvp = rowReader(fr); result[kvp.Key] = kvp.Value; }); tr.Commit(); } return(result); }, mode: LazyThreadSafetyMode.ExecutionAndPublication); if (this.subTables != null) { foreach (var item in this.subTables) { item.SchemaCompleted(); } } }