一种类似于Linq2EF的ORM查询语言OQL

bluedoctor 2017-02-19 12:23:47
加精
Linq2EF 是应用于EF的一种Linq 语言集成查询,EF是MS强大的ORM框架,如果是你自己的ORM该怎么办呢?

OQL是SOD框架的ORM功能的查询语言,下面,我们来对比下OQL与Linq2EF使用上的一些差别。

(1),Linq2EF查询示例:

Context context=new Context();
var result = (from book in context.Books
where book.Price > 200
orderby book.IssueDate descending
select new
{
Name = book.Name,
IssueNumber = "#" + book.Issue
}).ToList();


这里需要先定义 Context对象,在里面定义Books属性,之前必须有一个 Book实体类,具体过程不说了,代码不少。

(2),OQL查询示例:
首先在包管理器安装SOD框架的包:
Install-Package PDF.NET.SOD

然后引入下面的名字空间:
using PWMIS.Core.Extensions;

最后开始编写查询:

Books book =new Books();
var result= OQL.From(book)
.Where(cmp=>cmp.Property(book.Price) > 200)
.OrderBy(o=>o.Desc(book.IssueDate))
.End
.MapToList(()=>new {
Name = book.Name,
IssueNumber = "#" + book.Issue
});


使用OQL,不需要定义DbContext,直接使用实体类即可。

有关SOD框架的入门,请参考 http://pwmis.codeplex.com 首页示例。
=================
大家觉得哪种更方便呢?

另外大家可以去看我的 200分散分贴








...全文
5326 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
头狼一号 2017-03-01
  • 打赏
  • 举报
回复
来学习一下
bluedoctor 2017-02-28
  • 打赏
  • 举报
回复
更多OQL的内容,可以参考这个系列文章:ORM查询语言(OQL)简介--概念篇
  • 打赏
  • 举报
回复
qq_27329497 2017-02-27
  • 打赏
  • 举报
回复
学习了learning
q107770540 2017-02-23
  • 打赏
  • 举报
回复
足球中国 2017-02-20
  • 打赏
  • 举报
回复
2.0以后的yg语法,都是在别人项目中用,自己项目不会用的 /
EnForGrass 2017-02-20
  • 打赏
  • 举报
回复
相比EF,查询语句有简单也有复杂的。lambda表达式写法 但是EF还有标准的查询方式
bluedoctor 2017-02-20
  • 打赏
  • 举报
回复
引用 11 楼 dongxinxi 的回复:
Context提出来是可以方便开发者扩展或者重写某些东西的,比如可用来收集或拦截通过EF执行的SQL 可以设置选项,比如context.Configuration.ValidateOnSaveEnabled 还有事务的处理上面 功能越强大越复杂,越轻量效率越高
SOD框架也可以拦截执行的SQL,请参考: 图解“管道过滤器模式”应用实例:SOD框架的命令执行管道
bluedoctor 2017-02-20
  • 打赏
  • 举报
回复
比如在本例中更新书名,可以采用下面的方式:

Books book =new  Books();
book.Name="C语言程序设计(第二版)";
book.ID= 100;

EntityQuery<Book>.Instance.Update(book);
除此之外,也可以使用OQL更新,如下例子:

Books book =new  Books();
book.Name="C语言程序设计(第二版)";
book.ID= 100;

OQL q=OQL.From(book)
  .Update(book.Name)
  .Where(book.ID)
  .END;

EntityQuery<Book>.Instance.ExeucteOQL(q);
可见,SOD框架支持2种更新方式,并且没有状态跟踪问题,不需要先查询出实体再更新,跟你写SQL一样的感觉。
  • 打赏
  • 举报
回复
Context提出来是可以方便开发者扩展或者重写某些东西的,比如可用来收集或拦截通过EF执行的SQL 可以设置选项,比如context.Configuration.ValidateOnSaveEnabled 还有事务的处理上面 功能越强大越复杂,越轻量效率越高
bluedoctor 2017-02-20
  • 打赏
  • 举报
回复
引用 8 楼 starfd 的回复:
EF的context上下文还要用在其它更新、删除之类的地方,你这个OOL应该是只查,所以不需要上下文啊
OQL也可以做更新,就像写SQL那样
yiyoyiyocc 2017-02-20
  • 打赏
  • 举报
回复
EF的context上下文还要用在其它更新、删除之类的地方
  • 打赏
  • 举报
回复
EF的context上下文还要用在其它更新、删除之类的地方,你这个OOL应该是只查,所以不需要上下文啊
m0_37586538 2017-02-20
  • 打赏
  • 举报
回复
看不懂,太深奥
exception92 2017-02-20
  • 打赏
  • 举报
回复
瞅瞅看看,
bluedoctor 2017-02-19
  • 打赏
  • 举报
回复
引用 1 楼 ThinPro 的回复:
支持医生~我这种还在用.NET FRAMEWORK 2.0 的,正好可用
你们啥应用,居然还在用 .NET 2.0 ?
ThinPro 2017-02-19
  • 打赏
  • 举报
回复
支持医生~我这种还在用.NET FRAMEWORK 2.0 的,正好可用

13,190

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 分析与设计
社区管理员
  • 分析与设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧