Partilhar via


Como: Usar funções definidas pelo usuário com valor de tabela

Uma função com valor de tabela retorna um único conjunto de linhas (ao contrário dos procedimentos armazenados, que podem retornar várias formas de resultado). Como o tipo de retorno de uma função com valor de tabela é Table, você pode usar uma função com valor de tabela em qualquer lugar do SQL que você possa usar uma tabela. Você também pode tratar a função com valor de tabela da mesma forma que trataria uma tabela.

Exemplo 1

A função SQL a seguir afirma explicitamente que retorna um TABLEarquivo . Portanto, a estrutura do conjunto de linhas retornado é implicitamente definida.

CREATE FUNCTION ProductsCostingMoreThan(@cost money)  
RETURNS TABLE  
AS  
RETURN  
    SELECT ProductID, UnitPrice  
    FROM Products  
    WHERE UnitPrice > @cost  

LINQ to SQL mapeia a função da seguinte maneira:

[Function(Name="dbo.ProductsCostingMoreThan", IsComposable=true)]
public IQueryable<ProductsCostingMoreThanResult> ProductsCostingMoreThan([Parameter(DbType="Money")] System.Nullable<decimal> cost)
{
    return this.CreateMethodCallQuery<ProductsCostingMoreThanResult>(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), cost);
}
   <FunctionAttribute(Name:="dbo.ProductsCostingMoreThan", IsComposable:=True)> _
Public Function ProductsCostingMoreThan(<Parameter(DbType:="Money")> ByVal cost As System.Nullable(Of Decimal)) As IQueryable(Of ProductsCostingMoreThanResult)
       Return Me.CreateMethodCallQuery(Of ProductsCostingMoreThanResult)(Me, CType(MethodInfo.GetCurrentMethod, MethodInfo), cost)
   End Function

Exemplo 2

O código SQL a seguir mostra que você pode unir à tabela que a função retorna e tratá-la como faria com qualquer outra tabela:

SELECT p2.ProductName, p1.UnitPrice  
FROM dbo.ProductsCostingMoreThan(80.50)  
AS p1 INNER JOIN Products AS p2 ON p1.ProductID = p2.ProductID  

No LINQ to SQL, a consulta seria processada da seguinte maneira:

        var q =
from p in db.ProductsCostingMoreThan(80.50m)
join s in db.Products on p.ProductID equals s.ProductID
select new { p.ProductID, s.UnitPrice };
    Dim q = _
From p In db.ProductsCostingMoreThan(80.5), p1 In db.Products _
Where p.ProductID = p1.ProductID _
Select p.ProductID, p1.UnitPrice

Consulte também