Linq to Oracle 使用教程(六)将数据库的函数映射到方法
2010-12-04 16:46 麦舒 阅读(1106) 评论(0) 编辑 收藏 举报
创建自定义函数和存储过程
打开 ALinq 安装目录下的 Oracle(ODP)Samples 解决方案,然后运行 Sample3_StoreProcedure 项目,点击 "Click to Create Procedures" 按钮,当然,在运行前你得先修改连接字符串,如果你还没有修改的话。在创建完存储过程后,请将所它们编译。
将数据库的函数映射到方法
一、简单函数映射
我们首先来进行映射的是 Upper 函数,这是一个将字符串转为大写的函数,这个函数的一个输入字符串参数,并且返回也是字符串。
应该我们可以创建一个如下的方法映射到该函数去。

public partial class NorthwindDataContext : ALinq.DataContext
{
[ALinq.Mapping.Function(IsComposable = true, Name = "UPPER")]
public string Upper(
[ALinq.Mapping.Parameter(DbType = "VarChar")]
string text)
{
throw new NotSupportedException();
}
}
下面我们来运行一段代码,测试一下。

static void Main(string[] args)
{
var dc = new NorthwindDataContext()
{
Log = Console.Out
};
var names = dc.Products.Select(o => dc.Upper(o.Productname)).ToList();
foreach (var name in names)
Console.WriteLine(name);
}
运行结果:
二、返回结果集的函数映射
在 Server Explorer 面板中,展开 NORTHWIND 连接,并找到 Packages->PKG2->GET_ALL_CATEGORIES 函数。
我们现在来将它映谢到 DataContext 类的方法。双击打开,代码如下:

PACKAGE BODY PKG2 IS
FUNCTION GET_ALL_CATEGORIES RETURN MYTYPE IS
MYCS MYTYPE;
BEGIN
OPEN MYCS FOR SELECT CATEGORYID, CATEGORYNAME, DESCRIPTION
FROM CATEGORIES;
RETURN MYCS;
END GET_ALL_CATEGORIES;
END PKG2;
从代码我们可以看出,它是返回一个数据集,并且是没有参数的,对于返回单一类型的结果集,我们要使用的是 ALinq.ISingleResult<T> 类型。方法定义如下:

public partial class NorthwindDataContext : ALinq.DataContext
{
[ALinq.Mapping.Function(Name = "PKG2.GET_ALL_CATEGORIES")]
public ALinq.ISingleResult<Category> GetAllCategories()
{
var result = ExecuteMethodCall(this, (MethodInfo)MethodBase.GetCurrentMethod());
return (ISingleResult<Category>)result.ReturnValue;
}
}
调用该方法的代码:

static void Main(string[] args)
{
var dc = new NorthwindDataContext() { Log = Console.Out };
var categories = dc.GetAllCategories();
foreach (var category in categories)
Console.WriteLine("{0} {1}", category.Categoryid, category.Categoryname);
}
运行结果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述