用戶定義函數
我們可以在LINQ to SQL中使用用戶定義函數。只要把用戶 定義函數拖到O/R設計器中,LINQ to SQL自動使用FunctionAttribute屬性和 ParameterAttribute屬性(如果需要)將其函數指定為方法。這時,我們只需簡 單調用即可。
在這裡注意:使用用戶定義函數的時候必須滿足以下形式 之一,否則會出現InvalidOperationException異常情況。
具有正確映射 屬性的方法調用的函數。這裡使用FunctionAttribute屬性和 ParameterAttribute屬性。
特定於LINQ to SQL的靜態SQL方法。
.NET Framework方法支持的函數。
下面介紹幾個例子:
1.在Select中使用用戶定義的標量函數
所謂標量函數是指返回在 RETURNS 子句中定義的類型的單個數據值。可以使用所有標量數據類型,包括 bigint 和 sql_variant。不支持 timestamp 數據類型、用戶定義數據類型和非 標量類型(如 table 或 cursor)。在 BEGIN...END 塊中定義的函數主體包含 返回該值的 Transact-SQL 語句系列。返回類型可以是除 text、ntext、image 、cursor 和 timestamp 之外的任何數據類型。 我們在系統自帶的 NORTHWND.MDF數據庫中,有3個自定義函數,這裡使用 TotalProductUnitPriceByCategory,其代碼如下:
ALTER FUNCTION [dbo].[TotalProductUnitPriceByCategory]
(@categoryID int)
RETURNS Money
AS
BEGIN
-- Declare the return variable here
DECLARE @ResultVar Money
-- Add the T-SQL statements to compute the return value here
SELECT @ResultVar = (Select SUM(UnitPrice)
from Products
where CategoryID = @categoryID)
-- Return the result of the function
RETURN @ResultVar
END
我們將其拖到設計器中,LINQ to SQL通過 使用 FunctionAttribute 屬性將類中定義的客戶端方法映射到用戶定義的函數 。請注意,這個方法體會構造一個捕獲方法調用意向的表達式,並將該表達式傳 遞給 DataContext 進行轉換和執行。
[Function (Name="dbo.TotalProductUnitPriceByCategory",
IsComposable=true)]
public System.Nullable<decimal> TotalProductUnitPriceByCategory(
[Parameter (DbType="Int")] System.Nullable<int> categoryID)
{
return ((System.Nullable<decimal>) (this.ExecuteMethodCall(this,
((MethodInfo) (MethodInfo.GetCurrentMethod())), categoryID)
.ReturnValue));
}
我們使用時,可以用以下代碼來調用:
var q = from c in db.Categories
select new
{
c.CategoryID,
TotalUnitPrice =
db.TotalProductUnitPriceByCategory(c.CategoryID)
};
這時,LINQ to SQL自動生成SQL語句如下:
SELECT [t0].[CategoryID], CONVERT(Decimal(29,4),
[dbo].[TotalProductUnitPriceByCategory]([t0].[CategoryID]))
AS [TotalUnitPrice] FROM [dbo].[Categories] AS [t0]