예제 #1
0
 private IDbCommand CreateLinqDbCommand(DataConnection connection, LinqCommand linqCommand, TranslatedLinqCommand translatedCommand)
 {
     var cmd = connection.DbConnection.CreateCommand();
       cmd.CommandType = CommandType.Text;
       cmd.CommandText = translatedCommand.Sql;
       foreach (var qParam in translatedCommand.Parameters) {
     var value = qParam.ReadValue(linqCommand.ParameterValues) ?? DBNull.Value;
     var dbParam = cmd.CreateParameter(); //DbModel.Driver.AddParameter(cmd,  //
     dbParam.ParameterName = qParam.Name;
     //Value and parameter may need some tweaking, depending on server type
     DbModel.LinqSqlProvider.SetDbParameterValue(dbParam, value);
     cmd.Parameters.Add(dbParam);
       }
       return cmd;
 }
예제 #2
0
 private TranslatedLinqCommand TranslateSelect(LinqCommand command)
 {
     LinqCommandPreprocessor.PreprocessCommand(_dbModel.EntityApp.Model, command);
       var context = new TranslationContext(_dbModel, command);
       var cmdInfo = command.Info;
       // convert lambda params into an initial set of ExternalValueExpression objects;
       foreach (var prm in cmdInfo.Lambda.Parameters) {
     var inpParam = new ExternalValueExpression(prm);
     context.ExternalValues.Add(inpParam);
       }
       //Analyze/transform query expression
       var exprChain = ExpressionChain.Build(cmdInfo.Lambda.Body);
       var selectExpr = BuildSelectExpression(exprChain, context);
       // Analyze external values (parameters?), create DbParameters
       var commandParams = BuildParameters(command, context);
       // If there's at least one parameter that must be converted to literal (ex: value list), we cannot cache the query
       bool canCache = !context.ExternalValues.Any(v => v.SqlUse == ExternalValueSqlUse.Literal);
       if (!canCache)
     command.Info.Flags |= LinqCommandFlags.NoQueryCache;
       //Build SQL, compile object materializer
       var sqlBuilder = new SqlBuilder(_dbModel);
       var sqlStatement = sqlBuilder.BuildSelect(selectExpr);
       // Parameters are represented as {2}, {3}, etc.
       // Braces in string literals are escaped and are represented as '{0}' and '{1}'
       var sqlTemplate = sqlStatement.ToString();
       var sql = FormatSql(sqlTemplate, commandParams);
       var objMaterializer = CompileObjectMaterializer(context);
       var outType = context.CurrentSelect.Reader.Body.Type;
       var resultListCreator = ReflectionHelper.GetCompiledGenericListCreator(outType);
       //check if we need to create implicit result set processor
       if (selectExpr.ResultsProcessor == null) {
     var returnsResultSet = typeof(IQueryable).IsAssignableFrom(cmdInfo.Lambda.Body.Type);
     if (!returnsResultSet)
       selectExpr.ResultsProcessor = QueryResultsProcessor.CreateFirstSingleLast("First", outType);
       }
       var sqlQuery = new TranslatedLinqCommand(sqlTemplate, sql, commandParams, command.Info.Flags,
           objMaterializer, selectExpr.ResultsProcessor, resultListCreator);
       return sqlQuery;
 }