zoukankan      html  css  js  c++  java
  • Entity Framework 6.0 源码解读笔记(一)

            internal static TResult ExecuteSingle<TResult>(IEnumerable<TResult> query, Expression queryRoot)
            {
                return GetElementFunction<TResult>(queryRoot)(query); //①
            }
    
            private static Func<IEnumerable<TResult>, TResult> GetElementFunction<TResult>(Expression queryRoot)
            {
                SequenceMethod seqMethod;
                if (ReflectionUtil.TryIdentifySequenceMethod(queryRoot, true /*unwrapLambdas*/, out seqMethod))
                {
                    switch (seqMethod)
                    {
                        case SequenceMethod.First:
                        case SequenceMethod.FirstPredicate:
                            return (sequence) => { return sequence.First(); }; //②
    
                        case SequenceMethod.FirstOrDefault:
                        case SequenceMethod.FirstOrDefaultPredicate:
                            return (sequence) => { return sequence.FirstOrDefault(); };
    
                        case SequenceMethod.SingleOrDefault:
                        case SequenceMethod.SingleOrDefaultPredicate:
                            return (sequence) => { return sequence.SingleOrDefault(); };
                    }
                }
    
                return (sequence) => { return sequence.Single(); };
            }

    很久没学习C#新的语法了,读到这段代码时基本上懵了,只知道是Lambda表达式,但是比我平时所使用Lambda表达式可复杂多了。

    首先,我们来看GetElementFunction()方法,它返回的是一个方法委托,该委托的具有一个参数(即IEnumerable<TResult>)并返回一个指定类型的值(即TResult类)

    第①处代码分两步执行,第1步执行GetElementFunction<TResult>(queryRoot),我们假定执行的分支为第②处代码,那么实际返回的Lambda表达:(sequence) => { return sequence.First(); };

    该表达式可解读为下面的方法

    TResult AnonymousMethod(IEnumerable<TResult> sequence)
    {
      return sequence.First();
    }

    第2步,调用Lambda表达式的匿名方法,并将query参数传给它,Lambda表达式中sequence变量即等价于传入的query变量,相当于调用AnonymousMethod(query)

    总结:重点代码是上面标注了①②的两行,执行这条分支的代码相当于调用query.First();

  • 相关阅读:
    微信小程序开发--页面之间的跳转
    iOS基础UI控件介绍-Swift版
    iOS技术栈-Swift版
    SpringBoot实战(四)获取接口请求中的参数(@PathVariable,@RequestParam,@RequestBody)
    SpringBoot实战(三)代码热部署
    SpringBoot实战(二)Restful风格API接口
    SpringBoot实战(一)HelloWorld
    Spring Boot浅谈(是什么/能干什么/优点和不足)
    CentOS的基本设置界面
    虚拟机VM安装Linux系统CentOS7
  • 原文地址:https://www.cnblogs.com/wiseant/p/3729753.html
Copyright © 2011-2022 走看看