成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linq用戶定義函數剖析

開發 后端
這里介紹Linq用戶定義函數,這里在 LINQ to SQL 查詢中,對生成的Linq用戶定義函數方法MinUnitPriceByCategory的內聯調用。

學習Linq用戶定義函數時,經常會遇到Linq用戶定義函數問題,這里將介紹XX問題的解決方法。

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,其代碼如下:

  1. ALTER FUNCTION [dbo].[TotalProductUnitPriceByCategory]  
  2. (@categoryID int)  
  3. RETURNS Money  
  4. AS  
  5. BEGIN  
  6. -- Declare the return variable here  
  7. DECLARE @ResultVar Money  
  8. -- Add the T-SQL statements to compute the return value here  
  9. SELECT @ResultVar = (Select SUM(UnitPrice)   
  10. from Products   
  11. where CategoryID = @categoryID)   
  12. -- Return the result of the function  
  13. RETURN @ResultVar  
  14. END 

我們將其拖到設計器中,LINQ to SQL通過使用 FunctionAttribute 屬性將類中定義的客戶端方法映射到用戶定義的函數。請注意,這個方法體會構造一個捕獲方法調用意向的表達式,并將該表達式傳遞給 DataContext 進行轉換和執行。

  1. [Function(Name="dbo.TotalProductUnitPriceByCategory",  
  2. IsComposable=true)]  
  3. public System.Nullable<decimal> TotalProductUnitPriceByCategory(  
  4. [Parameter(DbType="Int")] System.Nullable<int> categoryID)  
  5. {  
  6. return ((System.Nullable<decimal>)(this.ExecuteMethodCall(this,   
  7. ((MethodInfo)(MethodInfo.GetCurrentMethod())), categoryID)  
  8. .ReturnValue));  

我們使用時,可以用以下代碼來調用:

  1. var q = from c in db.Categories  
  2. select new  
  3. {  
  4. c.CategoryID,  
  5. TotalUnitPrice =  
  6. db.TotalProductUnitPriceByCategory(c.CategoryID)  
  7. }; 

這時,LINQ to SQL自動生成SQL語句如下:

  1. SELECT [t0].[CategoryID], CONVERT(Decimal(29,4),  
  2. [dbo].[TotalProductUnitPriceByCategory]([t0].[CategoryID]))  
  3. AS [TotalUnitPrice] FROM [dbo].[Categories] AS [t0] 

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

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

  1. ALTER FUNCTION [dbo].[MinUnitPriceByCategory]  
  2. (@categoryID INT  
  3. )  
  4. RETURNS Money  
  5. AS  
  6. BEGIN  
  7. -- Declare the return variable here  
  8. DECLARE @ResultVar Money  
  9. -- Add the T-SQL statements to compute the return value here  
  10. SELECT @ResultVar = MIN(p.UnitPrice) FROM Products as p   
  11. WHERE p.CategoryID = @categoryID  
  12. -- Return the result of the function  
  13. RETURN @ResultVar  
  14. END 

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

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

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

  1. var q =  
  2. from p in db.Products  
  3. where p.UnitPrice ==  
  4. db.MinUnitPriceByCategory(p.CategoryID)  
  5. select p; 

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

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

【編輯推薦】

  1. Linq結果集形狀概述
  2. Linq存儲過程返回詳解
  3. Linq調用LoadProducts方法
  4. Linq使用數據表簡單描述
  5. Linq對象引用簡單介紹
責任編輯:佚名 來源: IT168
相關推薦

2009-09-10 14:37:57

LINQ匿名類型

2009-09-16 16:59:05

LINQ to XML

2009-09-17 13:15:20

LINQ查詢

2009-09-09 14:40:43

Linq to sql

2009-09-09 16:21:31

Linq使用sqlme

2009-09-14 10:13:02

LINQ查詢操作

2009-09-14 15:12:40

LINQ to XML

2009-09-14 10:35:15

Linq內部執行原理

2009-09-08 16:20:12

LINQ to SQL

2009-09-15 14:52:15

linq級聯刪除

2009-09-16 09:56:42

LINQ to SQL

2009-09-18 17:17:58

LINQ模型

2009-09-08 15:39:13

Linq使用Inser

2009-09-17 09:20:34

Linq和dLinq區

2009-09-07 16:25:14

Linq To SQL

2009-09-10 15:35:07

LINQ查詢表達式

2009-09-11 09:48:27

Linq Lambda

2009-09-17 15:22:38

LINQ to SQL

2009-09-07 21:25:59

Linq自定義

2009-09-07 17:18:33

LINQ查詢表達式
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.伊人.com | 国产一级淫片a直接免费看 免费a网站 | 久久综合一区 | 九九成人 | 可以在线观看av的网站 | 久久久精品一区二区三区 | 在线成人av| h视频在线观看免费 | 国产日韩欧美精品一区二区三区 | 欧美福利精品 | 99精品国产一区二区三区 | 久久亚洲精品视频 | 亚洲 日本 欧美 中文幕 | 天天综合网天天综合 | 日韩精品网站 | 日韩欧美在线播放 | 国产一二三区免费视频 | 毛片av免费看 | 精品国产一区二区三区性色av | 中日韩欧美一级片 | 精品免费国产视频 | 亚洲视频免费观看 | 精品久久久久久久久久久下田 | 国产视频福利一区 | 久草中文在线观看 | 91成人精品 | 久久国产欧美日韩精品 | 中文字幕一区二区三区四区五区 | 日韩有码一区 | 日韩在线中文字幕 | 美国黄色毛片 | 91麻豆产精品久久久久久 | 亚洲成人一级 | 毛片一区二区三区 | 欧美国产精品久久久 | 亚洲另类春色偷拍在线观看 | 久久国产一区二区三区 | 国产精品久久国产精品久久 | 日韩www| 狠狠狠色丁香婷婷综合久久五月 | 日本电影免费完整观看 |