日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Linq用戶定義函數(shù)剖析

學(xué)習(xí)Linq用戶定義函數(shù)時,經(jīng)常會遇到Linq用戶定義函數(shù)問題,這里將介紹XX問題的解決方法。

Linq用戶定義函數(shù)

我們可以在LINQ to SQL中使用Linq用戶定義函數(shù)。只要把Linq用戶定義函數(shù)拖到O/R設(shè)計器中,LINQ to SQL自動使用FunctionAttribute屬性和ParameterAttribute屬性(如果需要)將其函數(shù)指定為方法。這時,我們只需簡單調(diào)用即可。
在這里注意:使用Linq用戶定義函數(shù)的時候必須滿足以下形式之一,否則會出現(xiàn)InvalidOperationException異常情況。
◆具有正確映射屬性的方法調(diào)用的函數(shù)。這里使用FunctionAttribute屬性和 ParameterAttribute屬性。
◆特定于LINQ to SQL的靜態(tài)SQL方法。
◆.NET Framework方法支持的函數(shù)。

下面介紹幾個例子:

1.在Select中使用用戶定義的標(biāo)量函數(shù)

所謂標(biāo)量函數(shù)是指返回在 RETURNS 子句中定義的類型的單個數(shù)據(jù)值??梢允褂盟袠?biāo)量數(shù)據(jù)類型,包括 bigint 和 sql_variant。不支持 timestamp 數(shù)據(jù)類型、用戶定義數(shù)據(jù)類型和非標(biāo)量類型(如 table 或 cursor)。在 BEGIN...END 塊中定義的函數(shù)主體包含返回該值的 Transact-SQL 語句系列。返回類型可以是除 text、ntext、image、cursor 和 timestamp 之外的任何數(shù)據(jù)類型。我們在系統(tǒng)自帶的NORTHWND.MDF數(shù)據(jù)庫中,有3個自定義函數(shù),這里使用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 

我們將其拖到設(shè)計器中,LINQ to SQL通過使用 FunctionAttribute 屬性將類中定義的客戶端方法映射到用戶定義的函數(shù)。請注意,這個方法體會構(gòu)造一個捕獲方法調(diào)用意向的表達(dá)式,并將該表達(dá)式傳遞給 DataContext 進行轉(zhuǎn)換和執(zhí)行。

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

我們使用時,可以用以下代碼來調(diào)用:

 
 
 
  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從句中使用用戶定義的標(biāo)量函數(shù)

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

 
 
 
  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 

拖到設(shè)計器中,生成代碼如下:

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

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

 
 
 
  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]) 

本文題目:Linq用戶定義函數(shù)剖析
瀏覽地址:http://www.5511xx.com/article/dhpjjcp.html