zoukankan      html  css  js  c++  java
  • 自定义LINQ表达式支持,(内有植入广告,请自行过滤)

         好吧,我就招了吧,我是打算发个广告来着,可又一想,发个纯广告帖上来,肯定骂声一片,砖头、鸡蛋满天飞,道不如把DAC中,关于自定义LINQ表达式支持的代码讲解一下,或许对一些自己写数据层或者想写些LINQ扩展实用的人会有些帮助,就算没什么帮助,那就起到点儿“抛砖引玉”的作用,岂不是也很好!

    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)”中,当“查询”被执行时,就可以直接取出保存下来的“自定义”表达式,这样,再利用上代码原来对“自定义”表达式的解析,就可以实现查询了!!!

     

     

  • 相关阅读:
    福大软工 · 第十次作业
    最终作业:软工实践个人总结
    第三视角Beta答辩总结
    Beta 冲刺(7/7)
    Beta 冲刺 (6/7)
    Beta 冲刺 (5/7)
    Beta 冲刺 (4/7)
    Beta 冲刺 (3/7)
    Beta 冲刺 (2/7)
    福大软工 · 第十次作业
  • 原文地址:https://www.cnblogs.com/zhongzf/p/1672258.html
Copyright © 2011-2022 走看看