程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> LINQ體驗(15)——LINQ to SQL語句之用戶定義函數

LINQ體驗(15)——LINQ to SQL語句之用戶定義函數

編輯:關於ASP.NET

用戶定義函數

我們可以在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]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved