Entity Framework - Function Imports
Posted: Mon 18 Oct 2010 13:33
I'm trying to use the entity developer to add a function that returns a number and keep getting the exception
Im attempting to call the function using the ObjectContext ExecuteFunction
like so
I've also tried doing it this way:
which results in the following exception:
Am I doing something wrong or is this just not supported?? I was under the impression it was under EF4
Code: Select all
System.Data.EntityCommandExecutionException: The data reader returned by the store data provider does not have enough columns for the query requested
at System.Data.EntityClient.EntityCommandDefinition.ConstantColumnMapGenerator.System.Data.EntityClient.EntityCommandDefinition.IColumnMapGenerator.CreateColumnMap(DbDataReader reader)
at System.Data.EntityClient.EntityCommandDefinition.CreateColumnMap(DbDataReader storeDataReader)
at System.Data.Objects.ObjectContext.CreateFunctionObjectResult(EntityCommand entityCommand, EntitySet entitySet, EdmType edmType, MergeOption mergeOption)
at System.Data.Objects.ObjectContext.ExecuteFunction(String functionName, MergeOption mergeOption, ObjectParameter[] parameters)
at System.Data.Objects.ObjectContext.ExecuteFunction(String functionName, ObjectParameter[] parameters)
like so
Code: Select all
ObjectParameter[] parameters = {
new ObjectParameter("COMPANY", 3),
new ObjectParameter("ITEM_CODE", "4130791400352"),
new ObjectParameter("VAT_CODE", "Z"),
new ObjectParameter("VAT_LOCATION", 4)
};
decimal result;
result = model.ExecuteFunction("GetVatRate", parameters).FirstOrDefault();
Code: Select all
var query =
new ObjectQuery(
"DfxtestModel.Store.GET_VAT_RATE(@COMPANY, @ITEM_CODE, @VAT_CODE, @VAT_LOCATION)", model);
query.Parameters.Add(new ObjectParameter("COMPANY", 3));
query.Parameters.Add(new ObjectParameter("ITEM_CODE", "4130791400352"));
query.Parameters.Add(new ObjectParameter("VAT_CODE", "Z"));
query.Parameters.Add(new ObjectParameter("VAT_LOCATION", 4));
result = query.FirstOrDefault();
Code: Select all
Function metadata used in DbFunctionExpression must allow composition. Non-composable functions or functions that include command text are not allowed in expressions. Such functions can only be executed independently.
at System.Data.Common.CommandTrees.ExpressionBuilder.Internal.ArgumentValidation.ValidateFunction(EdmFunction function, IEnumerable`1 arguments, ref DbExpressionList validArgs)
at System.Data.Common.CommandTrees.ExpressionBuilder.DbExpressionBuilder.InvokeFunction(EdmFunction function, IEnumerable`1 arguments)
at System.Data.Common.CommandTrees.ExpressionBuilder.DbExpressionBuilder.Invoke(EdmFunction function, IEnumerable`1 arguments)
at System.Data.Common.EntitySql.SemanticAnalyzer.CreateModelFunctionCallExpression(MethodExpr methodExpr, MetadataFunctionGroup metadataFunctionGroup, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertModelFunctionCall(MetadataFunctionGroup metadataFunctionGroup, MethodExpr methodExpr, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertMethodExpr(MethodExpr methodExpr, Boolean includeInlineFunctions, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertMethodExpr(Node expr, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.Convert(Node astExpr, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertValueExpression(Node astExpr, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.ConvertQueryStatementToDbExpression(Statement astStatement, SemanticResolver sr)
at System.Data.Common.EntitySql.SemanticAnalyzer.AnalyzeQueryCommand(Node astExpr)
at System.Data.Common.EntitySql.CqlQuery.b__8(SemanticAnalyzer analyzer, Node astExpr)
at System.Data.Common.EntitySql.CqlQuery.AnalyzeSemanticsCommon(Node astExpr, Perspective perspective, ParserOptions parserOptions, IEnumerable`1 parameters, IEnumerable`1 variables, Func`3 analysisFunction)
at System.Data.Common.EntitySql.CqlQuery.AnalyzeQueryExpressionSemantics(Node astQueryCommand, Perspective perspective, ParserOptions parserOptions, IEnumerable`1 parameters, IEnumerable`1 variables)
at System.Data.Common.EntitySql.CqlQuery.c__DisplayClass4.b__3(Node astCommand, ParserOptions validatedParserOptions)
at System.Data.Common.EntitySql.CqlQuery.CompileCommon(String commandText, Perspective perspective, ParserOptions parserOptions, Func`3 compilationFunction)
at System.Data.Common.EntitySql.CqlQuery.CompileQueryCommandLambda(String queryCommandText, Perspective perspective, ParserOptions parserOptions, IEnumerable`1 parameters, IEnumerable`1 variables)
at System.Data.Objects.EntitySqlQueryState.Parse()
at System.Data.Objects.ELinq.ExpressionConverter.TranslateInlineQueryOfT(ObjectQuery inlineQuery)
at System.Data.Objects.ELinq.ExpressionConverter.ConstantTranslator.TypedTranslate(ExpressionConverter parent, ConstantExpression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TranslateSet(Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.UnarySequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod)
at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator`1.Translate(ExpressionConverter parent, Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq)
at System.Data.Objects.ELinq.ExpressionConverter.Convert()
at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable`1 forMergeOption)
at System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption)
at System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable.GetEnumerator()
at System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source)
at System.Data.Objects.ELinq.ObjectQueryProvider.b__1(IEnumerable`1 sequence)
at System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable`1 query, Expression queryRoot)
at System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression)
at System.Linq.Queryable.FirstOrDefault(IQueryable`1 source)
Code: Select all