这里介绍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,其代码如下:
- ALTERFUNCTION[dbo].[TotalProductUnitPriceByCategory]
- (@categoryIDint)
- RETURNSMoney
- AS
- BEGIN
- --Declarethereturnvariablehere
- DECLARE@ResultVarMoney
- --AddtheT-SQLstatementstocomputethereturnvaluehere
- SELECT@ResultVar=(SelectSUM(UnitPrice)
- fromProducts
- whereCategoryID=@categoryID)
- --Returntheresultofthefunction
- RETURN@ResultVar
- END
咱们将其拖到规划器中,LINQ to SQL经过运用 FunctionAttribute 特点将类中界说的客户端办法映射到用户界说的函数。请留意,这个办法领会结构一个捕获办法调用意向的表达式,并将该表达式传递给 DataContext 进行转化和履行。
- [Function(Name="dbo.TotalProductUnitPriceByCategory",
- IsComposable=true)]
- publicSystem.Nullable<decimal>TotalProductUnitPriceByCategory(
- [Parameter(DbType="Int")]System.Nullable<int>categoryID)
- {
- return((System.Nullable<decimal>)(this.ExecuteMethodCall(this,
- ((MethodInfo)(MethodInfo.GetCurrentMethod())),categoryID)
- .ReturnValue));
- }
咱们运用时,能够用以下代码来调用:
- varq=fromcindb.Categories
- selectnew
- {
- 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自界说函数如下:
- ALTERFUNCTION[dbo].[MinUnitPriceByCategory]
- (@categoryIDINT
- )
- RETURNSMoney
- AS
- BEGIN
- --Declarethereturnvariablehere
- DECLARE@ResultVarMoney
- --AddtheT-SQLstatementstocomputethereturnvaluehere
- SELECT@ResultVar=MIN(p.UnitPrice)FROMProductsasp
- WHEREp.CategoryID=@categoryID
- --Returntheresultofthefunction
- RETURN@ResultVar
- END
拖到规划器中,生成代码如下:
- [Function(Name="dbo.MinUnitPriceByCategory",IsComposable=true)]
- publicSystem.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 会用办法调用表达式创立一个简略查询并履行。
- varq=
- frompindb.Products
- wherep.UnitPrice==
- db.MinUnitPriceByCategory(p.CategoryID)
- selectp;
它主动生成的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成果集形状概述
- Linq存储进程回来详解
- Linq调用LoadProducts办法
- Linq运用数据表简略描绘
- Linq目标引证简略介绍
知优网 » Linq用户界说函数分析