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 TABLE
arquivo . 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