文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Linq中用户定义函数的原理是什么

2023-06-17 22:00

关注

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中用户定义函数的原理是什么问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网行业资讯频道了解更多相关知识。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯