2011-05-19 20 views
5

Estoy trabajando en una aplicación que accede a los datos de una base de datos Oracle 11g. Estoy usando EF4 y se accede a los datos usando LINQ. Me encontré con un escenario donde necesito llamar a una función almacenada en un paquete. Esta función también tiene un valor de retorno. He agregado esta función al modelo de datos de la entidad pero no puedo realizar "Agregar importación de función" en ella. Por lo tanto, no puedo acceder usando LINQ. ¿Cómo puedo llamar a esta función y también obtener su valor de retorno?Cómo llamar a la función de Oracle, con un valor de retorno usando LINQ a Entidades?

Hace un tiempo hice esta pregunta, pero todavía no tengo ninguna respuesta. De todos modos, lo estoy actualizando con algunos detalles para que sea conveniente que otros entiendan el problema y me guíen en la dirección correcta. He tratado de implementar la solución propuesta en este question, pero estoy recibiendo una excepción.

He añadido lo siguiente al archivo designer.cs de mi modelo de datos entidad:

[EdmFunction("TestModel.Store", "TestFunction")] 
    public int TestFunction(decimal ALNR, decimal ATID, decimal AUKENR) 
    { 
     throw new ApplicationException(); 
    } 

A continuación se presenta una pequeña parte del archivo edmx:

<edmx:Edmx Version="2.0" xmlns:edmx="http://schemas.microsoft.com/ado/2008/10/edmx"> 
<!-- EF Runtime content --> 
    <edmx:Runtime> 
    <!-- SSDL content --> 
     <edmx:StorageModels> 
      <Schema Namespace="TestModel.Store" Alias="Self" Provider="Oracle.DataAccess.Client" ProviderManifestToken="11g" xmlns:store="http://schemas.microsoft.com/ado/2007/12/edm/EntityStoreSchemaGenerator" xmlns="http://schemas.microsoft.com/ado/2009/02/edm/ssdl"> 
       <Function Name="TestFunction" ReturnType="number" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" StoreFunctionName="PKG_TURNUS.SUMUKE" Schema="SYSTEM"> 
     <Parameter Name="ATID" Type="number" Mode="In" /> 
     <Parameter Name="ALNR" Type="number" Mode="In" /> 
     <Parameter Name="AUKENR" Type="number" Mode="In" /> 
    </Function> 

Aquí es cómo estoy llamando esta función:

var selectQuery = from T in _context.Table1 
        join A in _context.Table2 on T.columnA equals A.columnB 
        join TU in _context.Table3 on T.columnC equals TU.columnD 
        where T.columnD == 5 && T.columnE == someVariable 
        select new someType 
        { 
         propertyA = A.columnG, 
         propertyB = _context.TestFunction(T.columnE, A.columnF, TU.columnH) 
        }; 

Pero cuando lo haga cualquiera de los siguientes:

o

foreach (var ttu in selectQuery) //Exception thrown at runtime 
{ 
    double testval = ttu.propertyB; 
} 

tengo la excepción que se produce en esa función "ApplicationException". ¿No debería lanzarse esta excepción cuando se llama a esta función en cualquier otro lugar, excepción a la consulta L2E?

¿Qué estoy haciendo mal? ¿Cómo puedo llamar a una función de oráculo de Linq-To-Entities? Tenga en cuenta que la función a la que intento llamar no es una función de oráculo incorporada, sino una función definida por el usuario.

Respuesta

4

Por lo que he trabajado en EF4 usando Oracle, la importación de funciones no parece funcionar aquí. Hace unos meses enfrenté el mismo problema y probé muchas formas de importar una función pero sin suerte. Pero durante la búsqueda encontré un enlace en OTN que indica que (las funciones almacenadas de Oracle no son compatibles). EF4 no nos da la opción de llamar a la función de oráculo todavía. Incluso utilizando procedimientos almacenados, deberá seleccionar procedimientos almacenados que devuelvan un cursor de referencia. Los procedimientos almacenados admitidos incluyen procedimientos y métodos de paquete que no tienen un valor de retorno, pero pueden tener parámetros OUT o IN OUT.

Here is the link

Pero si usted está utilizando el servidor SQL de alguna forma se puede lograr la función definida por el usuario en la importación EF4. Aquí hay algunos enlaces que pueden le ayuda a:

Link1

Link2

Cuestiones relacionadas