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();

  • 相关阅读:
    LeetCode 242. Valid Anagram (验证变位词)
    LeetCode 205. Isomorphic Strings (同构字符串)
    LeetCode 204. Count Primes (质数的个数)
    LeetCode 202. Happy Number (快乐数字)
    LeetCode 170. Two Sum III
    LeetCode 136. Single Number (落单的数)
    LeetCode 697. Degree of an Array (数组的度)
    LeetCode 695. Max Area of Island (岛的最大区域)
    Spark中的键值对操作
    各种排序算法总结
  • 原文地址:https://www.cnblogs.com/wiseant/p/3729753.html
Copyright © 2011-2022 走看看