这里介绍Linq用户定义函数,这里在 LINQ to SQL 查询中,对生成的Linq用户定义函数方法MinUnitPriceByCategory的内联调用。

学习Linq用户界说函数时,经常会遇到Linq用户界说函数问题,这儿将介绍XX问题的解决办法。

Linq用户界说函数分析  Linq用户定义函数 第1张

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. ALTERFUNCTION[dbo].[TotalProductUnitPriceByCategory]
  2. (@categoryIDint)
  3. RETURNSMoney
  4. AS
  5. BEGIN
  6. --Declarethereturnvariablehere
  7. DECLARE@ResultVarMoney
  8. --AddtheT-SQLstatementstocomputethereturnvaluehere
  9. SELECT@ResultVar=(SelectSUM(UnitPrice)
  10. fromProducts
  11. whereCategoryID=@categoryID)
  12. --Returntheresultofthefunction
  13. RETURN@ResultVar
  14. END

咱们将其拖到规划器中,LINQ to SQL经过运用 FunctionAttribute 特点将类中界说的客户端办法映射到用户界说的函数。请留意,这个办法领会结构一个捕获办法调用意向的表达式,并将该表达式传递给 DataContext 进行转化和履行。

  1. [Function(Name="dbo.TotalProductUnitPriceByCategory",
  2. IsComposable=true)]
  3. publicSystem.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));
  9. }

咱们运用时,能够用以下代码来调用:

  1. varq=fromcindb.Categories
  2. selectnew
  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. ALTERFUNCTION[dbo].[MinUnitPriceByCategory]
  2. (@categoryIDINT
  3. )
  4. RETURNSMoney
  5. AS
  6. BEGIN
  7. --Declarethereturnvariablehere
  8. DECLARE@ResultVarMoney
  9. --AddtheT-SQLstatementstocomputethereturnvaluehere
  10. SELECT@ResultVar=MIN(p.UnitPrice)FROMProductsasp
  11. WHEREp.CategoryID=@categoryID
  12. --Returntheresultofthefunction
  13. RETURN@ResultVar
  14. END

拖到规划器中,生成代码如下:

  1. [Function(Name="dbo.MinUnitPriceByCategory",IsComposable=true)]
  2. publicSystem.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));
  8. }

这时能够运用了:留意这儿在 LINQ to SQL 查询中,对生成的Linq用户界说函数办法MinUnitPriceByCategory的内联调用。此函数不会当即履行,这是由于查询会推迟履行。推迟履行的查询中包括的函数直到此查询履行时才会履行。为此查询生成的 SQL 会转化成对数据库中Linq用户界说函数的调用(请参见此查询后边的生成的 SQL句子),当在查询外部调用这个函数时,LINQ to SQL 会用办法调用表达式创立一个简略查询并履行。

  1. varq=
  2. frompindb.Products
  3. wherep.UnitPrice==
  4. db.MinUnitPriceByCategory(p.CategoryID)
  5. selectp;

它主动生成的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目标引证简略介绍
转载请说明出处
知优网 » Linq用户界说函数分析

发表评论

您需要后才能发表评论