EF 5 y Table Value Functions

El soporte de TVF ha sido uno de los elementos más demandados dentro de los foros y listas de insiders al grupo de ADO.NET. A pesar de que teníamos en EDM pequeños trucos con lo que podríamos hacer funcionar esta característica en 4.0, aunque seguro que todos los que habéis jugado con EDM sabéis que no es muy buena idea andar tocando a mano el XML subyacente, por no decir que es de lo más viscoso con lo que puedas encontrarte, el convertir a estas UDF’s en ciudadanos de primer nivel parecía algo necesario que por suerte tenemos ya disponible de forma idéntica a como usamos procedimientos almacenados en la actualidad. Por supuesto, no voy a hacer una introducción a las TVF’s, seguro que ya hay mucho contenido en internet sobre el asunto, por lo que lo único que diremos es que a grosso modo los TVF aúnan lo bueno de las vistas, la composición, y lo bueno de los procedimientos, que pueden contener código procedural, permitiéndonos ya sobre EF mezclarlas con L2E y ESQL, que es lo que a nosotros nos dará más valor todavía. Con el fin de mostrar un pequeño ejemplo partiremos de una sencilla tabla en la que tenemos un índice full text ,el script de esta tabla es el siguiente:

 

SET ANSI_NULLS ON
GO
 
SET QUOTED_IDENTIFIER ON
GO
 
CREATE TABLE [dbo].[book](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [name] [nvarchar](200) NOT NULL,
    [description] [nvarchar](max) NOT NULL,
    [isbn] [nvarchar](15) NOT NULL,
 CONSTRAINT [PK_book] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
 
GO

Acto seguido, crearemos una también sencilla TVF que haga una query  usando full text sobre la tabla anterior, por ejemplo, la siguiente udf.

 

CREATE FUNCTION [dbo].[BookFullText]
(@text NVARCHAR(4000))
RETURNS TABLE
RETURN
 SELECT isbn,name
 FROM dbo.book
 WHERE CONTAINS([description], @text);

 

 

Una vez hecho el trabajo, como comentábamos anteriormente, ya podemos mapear esta TVF dentro de nuestros modelos EDM igual que un procedimiento almacenado, para esto, sino sabe como, le recomiendo seguir la siguiente guía, y utilizarlos de diversas maneras, aunque mezclándolas con nuestras L2E es como se ve mejor el porque de la importancia de esta mejora.

A continuación se puede ver el uso de la función anterior:

 

var result = from author in unitOfWork.Authors
              join books in unitOfWork.BookFullText("framework")
              on author.id equals books.Value
              select author;

 

Que produciría la siguiente traza TSQL

 

exec sp_executesql N'SELECT 
[Extent1].[id] AS [id], 
[Extent1].[name] AS [name]
FROM  [dbo].[Author] AS [Extent1]
INNER JOIN [dbo].[BookFullText](@text) AS [Extent2] ON [Extent1].[id] = [Extent2].[id]',N'@text nvarchar(4000)',@text=N'framework'

 

 

Bueno, aquí termina esta entrada…

 

Saludos

Unai

Published 29/6/2012 12:26 por Unai
Comparte este post:
http://geeks.ms/blogs/unai/archive/2012/06/29/ef-5-y-table-value-functions.aspx