visual una metodos metodo mandar llamar funciones funcion firma definicion declarar crear como c# entity-framework linq-to-entities entity-framework-4

c# - una - Llamando funciones definidas por el usuario en Entity Framework 4



metodos en c# (7)

Finalmente lo resolví: D Para funciones escalares, puede agregar la cláusula FROM {1}.

bool result = FooContext.CreateQuery<bool>( "SELECT VALUE FooModel.Store.UserDefinedFunction(@someParameter) FROM {1}", new ObjectParameter("someParameter", someParameter) ).First();

Este es definitivamente un caso para usar LINQ to SQL sobre EF.

Tengo una función definida por el usuario en una base de datos de SQL Server 2005 que devuelve un poco. Me gustaría llamar a esta función a través del Entity Framework. He estado buscando alrededor y no he tenido mucha suerte.

En LINQ to SQL esto fue obscenamente fácil, solo agregaría la función al Modelo de contexto de datos, y podría llamarlo así.

bool result = FooContext.UserDefinedFunction(someParameter);

Al usar Entity Framework, agregué la función a mi modelo y aparece en SomeModel.Store / Stored Procedures en el navegador de modelos.

El modelo no ha generado ningún código para la función, el XML para el archivo .edmx contiene:

<Function Name="UserDefinedFunction" ReturnType="bit" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="true" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo"> <Parameter Name="someParameter" Type="int" Mode="In" /> </Function>

Lo más cerca que pude conseguir fue algo como esto:

bool result = ObjectContext.ExecuteFunction<bool>( "UserDefinedFunction", new ObjectParameter("someParameter", someParameter) ).First();

Pero tengo el siguiente mensaje de error:

La FunctionImport ''UserDefinedFunction'' no se pudo encontrar en el contenedor ''FooEntities''.

Los nombres han sido cambiados para proteger al inocente.

tldr: ¿Cómo invoco funciones definidas por el usuario de valor escalar usando Entity Framework 4.0?


Llamando una función en EF4 con ODPNET beta 2 (Oracle), que devuelve un NÚMERO:

using (var db = new FooContext()) { var queryText = "SELECT FooModel.Store.MY_FUNC(@param) FROM {1}" var result = db.CreateQuery<DbDataRecord>(queryText,new ObjectParameter("param", paramvalue)); return result.First().GetDecimal(0); }

Lo estoy agregando aquí porque, basado en el código de Evil Pigeon, podría resolverlo para Oracle. (También votó su respuesta).



Puede que te resulte útil. Parece que solo puedes llamarlos a través de eSQL directamente y no usar Linq.


Si desea llamar a la función con valores de tabla en MS SQL a través de Entity Framework; Puedes usar esto:

var retval = db.Database.SqlQuery<MyClass>(String.Format(@"select * from dbo.myDatabaseFunction({0})", id));


pensamiento id agregar una nota para cualquier otra persona que se encuentre con esto, si su parámetro de función sql es anulable, debe llamar a la función en sql con el valor del parámetro "predeterminado". Para llamar a una función como esa usando Entity Framwork

bool result = FooContext.CreateQuery<bool>( "SELECT VALUE FooModel.Store.UserDefinedFunction(null) FROM {1}" ).First();


Llamando a la función de SQL de tipo estático definido

Puedes usar ExecuteStoreQuery ,

  • El primer parámetro toma la función de SQL que llama a la declaración en formato de cadena
  • El segundo parámetro toma un objeto de la clase SqlParameter en el que pasa el nombre del parámetro de su función con su valor. como se muestra en el siguiente método

public string GetNumberOFWorkDays(Guid leaveID) { using (var ctx = new INTERNAL_IntranetDemoEntities()) { return ctx.ExecuteStoreQuery<string>( "SELECT [dbo].[fnCalculateNumberOFWorkDays](@leaveID)", new SqlParameter { ParameterName = "leaveID", Value = leaveID } ).FirstOrDefault(); } }