中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linq中用戶定義函數的原理是什么

發布時間:2021-07-14 14:36:02 來源:億速云 閱讀:118 作者:Leah 欄目:編程語言

Linq中用戶定義函數的原理是什么,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

Linq用戶定義函數

我們可以在LINQ to SQL中使用Linq用戶定義函數。只要把Linq用戶定義函數拖到O/R設計器中,LINQ to SQL自動使用FunctionAttribute屬性和ParameterAttribute屬性(如果需要)將其函數指定為方法。這時,我們只需簡單調用即可。
在這里注意:使用Linq用戶定義函數的時候必須滿足以下形式之一,否則會出現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]

2.在Where從句中使用用戶定義的標量函數

這個例子使用方法同上一個例子原理基本相同了,MinUnitPriceByCategory自定義函數如下:

ALTER FUNCTION [dbo].[MinUnitPriceByCategory]  (@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 = MIN(p.UnitPrice) FROM Products as p   WHERE p.CategoryID = @categoryID  -- Return the result of the function  RETURN @ResultVar  END

拖到設計器中,生成代碼如下:

[Function(Name="dbo.MinUnitPriceByCategory", IsComposable=true)]  public System.Nullable<decimal> MinUnitPriceByCategory(  [Parameter(DbType="Int")] System.Nullable<int> categoryID)  {  return ((System.Nullable<decimal>)(this.ExecuteMethodCall(  this, ((MethodInfo)(MethodInfo.GetCurrentMethod())),  categoryID).ReturnValue));  }

這時可以使用了:注意這里在 LINQ to SQL 查詢中,對生成的Linq用戶定義函數方法MinUnitPriceByCategory的內聯調用。此函數不會立即執行,這是因為查詢會延遲執行。延遲執行的查詢中包含的函數直到此查詢執行時才會執行。為此查詢生成的 SQL 會轉換成對數據庫中Linq用戶定義函數的調用(請參見此查詢后面的生成的 SQL語句),當在查詢外部調用這個函數時,LINQ to SQL 會用方法調用表達式創建一個簡單查詢并執行。

var q =  from p in db.Products  where p.UnitPrice ==  db.MinUnitPriceByCategory(p.CategoryID)  select p;

它自動生成的SQL語句如下:

SELECT [t0].[ProductID], [t0].[ProductName], [t0].[SupplierID],  [t0].[CategoryID],[t0].[QuantityPerUnit], [t0].[UnitPrice],  [t0].[UnitsInStock], [t0].[UnitsOnOrder],[t0].[ReorderLevel],  [t0].[Discontinued]FROM [dbo].[Products] AS [t0]  WHERE [t0].[UnitPrice] =   [dbo].[MinUnitPriceByCategory]([t0].[CategoryID])

關于Linq中用戶定義函數的原理是什么問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

巴彦县| 巴林左旗| 阿拉善右旗| 汉阴县| 凤冈县| 福建省| 含山县| 宁国市| 鲁甸县| 孟州市| 刚察县| 保康县| 久治县| 宁国市| 邢台县| 滕州市| 江达县| 石河子市| 依兰县| 北海市| 贺兰县| 孝义市| 东阳市| 盐边县| 晋宁县| 紫阳县| 临沧市| 南溪县| 进贤县| 沁阳市| 镶黄旗| 泉州市| 二连浩特市| 长丰县| 新巴尔虎右旗| 左权县| 元江| 建阳市| 牟定县| 宁化县| 株洲县|