- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
LinqToDB 源码分析——生成表达式树
LinqToDB 源码分析——生成表达式树
当我们知道了Linq查询要用到的数据库信息之后。接下就是生成对应的表达式树。在前面的章节里面笔者就已经介绍过。生成表达式树是事实离不开IQueryableT接口。而处理表达式树离不开IQueryProvider接口。LinqToDB框架跟这俩个接口有关系的有三个类:TableT类、ExpressionQueryT类、ExpressionQueryImplT类。其中最重要的是ExpressionQueryT类。他是TableT和ExpressionQueryImplT类的父类。而本章就是围绕这三个类进行的。
IQueryableT接口和IQueryProvider接口
ExpressionQueryT类是一个抽象类。他实现于IExpressionQuery接口。IExpressionQuery接口却同时继续了IQueryableT接口和IQueryProvider接口。所以ExpressionQueryT类实际上同时实现了俩个接口。而同时自己增加一个属性SqlText和一个跟IQueryable接口一样子的Expression属性。SqlText属性是用于获得当前表达式对应的SQL语句。这个属性显然在开发过程非常有用。而Expression属性是用于生成表达式树的。
public interface IExpressionQueryout T : IOrderedQueryableT, IQueryProvider
{
new Expression Expression { get; set; }
string SqlText { get; }
}
从前面的章节里面,我们可以知道实现IQueryableT接口和IQueryProvider接口的类有俩个部分的职责。一是帮助生成表达式树,二是用于Linq To SQL的数据源的入口。作者也相应的设计了俩个类。就是上面讲到的TableT和ExpressionQueryImplT类。ExpressionQueryImplT类用于前者,而TableT类用于后者。
var query = from p in dbContext.Products where p.ProductID == 30 select p;
上面这段Linq查询中的dbContext.Products。事实上是通过IDataContext的静态扩展方法GetTableT来实现的。当然事情并没有这么简单。从源码中笔者看到这一个过程还离不开DataContextInfo类。DataContextInfo类是里面存放了关于DataContext类实例的信息。从代码量我们可以知道一个信息——DataContextInfo类必须有。
protected void Init(IDataContextInfo dataContextInfo, Expression expression)
{
DataContextInfo = dataContextInfo ?? new DefaultDataContextInfo();
Expression = expression ?? Expression.Constant(this);
}
我们都知道在生成表达式树的时候,实现俩个CreateQuery方法的重要性。LinqToDB框架也离不开这一点。CreateQueryTElement方法直接新建一个ExpressionQueryImplTElement类。而CreateQuery方法用反射来实现(笔者认为这地方只有这里有看点其他的真的没有)。关于ExpressionQueryImplTElement类真的没有什么可说的。笔者也就不提他了。
泛型CreateQuery方法:
IQueryableTElement IQueryProvider.CreateQueryTElement(Expression expression)
{
if (expression == null)
throw new ArgumentNullException(expressionreturn new ExpressionQueryImplTElement(DataContextInfo, expression);
}
普通CreateQuery方法:
复制代码
IQueryable IQueryProvider.CreateQuery(Expression expression)
{
if (expression == null)
throw new ArgumentNullExcep
您可能关注的文档
- 中石化北京石油SharePlex 配置过程.doc
- 2013.12英语六级真题 三套 无听力 打印版.docx
- Question--8分析您的学生听说能力上存在的不足.doc
- execute,executeQuery,executeUpdate三个方法的区别.docx
- 英概一句话简答完整版(余志远版本).doc
- 作业提交系统Torque个人安装总结.doc
- 第九章 英国社会.doc
- 英语词根汇编.doc
- 丘吉尔二战经典演讲:热血、汗水和眼泪.doc
- 云风的求解最短路径代码.doc
- 新视野二版听说1第6单元示范1课件.ppt
- 【参考答案】 联络口译(第二版) 《联络口译》(第二版)参考答案.pdf
- 梅大高速茶阳路段“5·1”塌方灾害调查评估报告.docx
- 虹吸雨水PE管施工节点标准做法.pdf
- 2025消防设施施工质量常见通病防治手册,典型图示+规范要求.pptx
- 新视野大学英语(第二版)读写教程 4 空军工程大学编U05B.ppt
- E英语教程2(智慧版)Unit 6.pptx
- E英语教程3(智慧版)Unit 7.ppt
- 新视野二版读写1第4单元课件Section A How to Make a Good Impression.pptx
- E英语视听说教程4(智慧版)4-U2课件(2024版)U2.pptx
最近下载
- 食品风味化学(第二版) 课件 第10--12章 风味料在食品加工中的应用、食品的异味、食品风味质量评价与安全控制.pptx
- 大班语言《美丽的礼物》.ppt
- 孟子对先秦名实观发展的贡献-来源:现代哲学(第2019003期)-广东哲学学会.pdf VIP
- 2023年江西财经大学信息管理与信息系统专业《数据结构与算法》科目期末试卷B(有答案).docx VIP
- 乡镇交通安全课件PPT.pptx VIP
- 影视欣赏社团活动计划.docx VIP
- 食品风味化学(第二版) 课件 第8、9章 风味物质的提取与分析、 食品中风味的释放和稳定化.pptx
- 2023年江西财经大学信息管理与信息系统专业《数据结构与算法》科目期末试卷A(有答案).docx VIP
- 《进食障碍》课件.ppt VIP
- 音乐_上学歌_课件.pptx
文档评论(0)