/// <summary> /// Transforms the expression tree into SQL script, executes it and returns the result. /// </summary> /// <param name="expression"></param> /// <returns></returns> public object Execute(Expression expression) { var methodExpression = (MethodCallExpression)expression; var genericType = ExpressionHelper.GetFirstGenericTypeArgumentOfType(methodExpression.Method); var isACommand = IsACommand(methodExpression); var queryTranslator = new QueryTranslator(_mappingRuleTranslator); var query = queryTranslator.Translate(expression); var mappingDefinition = _mappingRuleTranslator.GetMappingDefinition(genericType); object result = null; if (isACommand) { result = query; _queryTracker.AddQuery(() => _queryExecutor.ExecuteCommandAndReturnObject(query)); } else { result = _queryExecutor.ExecuteReaderAndReturnList(query, mappingDefinition); } return(result); }