在DAC的之前版本中,使用如下表达式进行查询:
IEnumerable<Issue> q = this.dc.Query<Issue>(Issue._.IssueID >= 0);
这个“可爱”的”_”显得是那样的“不成熟”,特别是在这个LINQ横行的时代,显得特不“与时俱进”。于是就有了对DAC扩展LINQ支持的v2.6版。
var q = this.dc.Query<Issue>(s => s.IssueID > 0);
或
var q = from s in (this.dc.GetQueryableData<Issue>())
where s.IssueID > 0
select s;
上面的两种方法的实现,主要是靠对表达式的解析,组装SQL语句。老赵的帖子写的很好,也可以看DAC的源码(我是植入广告)。
我今天主要想说的是,如果我们原来有自已的表达式树及其解析功能,那能不能让它很容易的“升级”到LINQ的支持呢?!是的,很容易!
var q = from s in SystemUser._
where s.FullName == s.FullName.Max
orderby s.UserID
select s.Except(s.Password);
要相让一个对象可以被”where”, “orderby”, “select”,那就让它实现名为”Where”, “OrderBy”, “Select”的方法,或使用Extension Method方式,就象DAC中:
public static class QueryExpressionExtension
{
public static RaisingStudio.Data.Expressions.IQueryExpression<T> Where<T>(
this RaisingStudio.Data.Expressions.IQueryExpression<T> source,
Expression<Func<T, RaisingStudio.Data.Expressions.ConditionExpression>> predicate)
{
return (new RaisingStudio.Data.Expressions.QueryExpression<T>(
source.Value,
source.Table,
(predicate.Compile())(source.Value),
source.Columns));
}
public static RaisingStudio.Data.Expressions.IQueryExpression<T> OrderBy<T>(
this RaisingStudio.Data.Expressions.IQueryExpression<T> source,
Expression<Func<T, RaisingStudio.Data.Expressions.ColumnExpression>> predicate)
{ … }
public static RaisingStudio.Data.Expressions.IQueryExpression<T> Select<T>(
this RaisingStudio.Data.Expressions.IQueryExpression<T> source,
Expression<Func<T, object>> predicate)
{ ... }
}
在方法的实现中,对传入的“系统”表达式,进行Compile方法调用,即可返回“自定义”的表达式,然后将这些“自定义”的表达式保存在“查询表达式(QueryExpression)”中,当“查询”被执行时,就可以直接取出保存下来的“自定义”表达式,这样,再利用上代码原来对“自定义”表达式的解析,就可以实现查询了!!!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2006-02-23 const 与 static readonly 的区别