首页 > 其他 > 详细

Entity Framework 6.0 源码解读笔记(一)

时间:2014-05-15 20:54:59      阅读:393      评论:0      收藏:0      [点我收藏+]
bubuko.com,布布扣
        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(); };
        }
bubuko.com,布布扣

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

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

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

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

bubuko.com,布布扣
TResult AnonymousMethod(IEnumerable<TResult> sequence)
{
  return sequence.First();
}
bubuko.com,布布扣

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

 

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

 

Entity Framework 6.0 源码解读笔记(一),布布扣,bubuko.com

Entity Framework 6.0 源码解读笔记(一)

原文:http://www.cnblogs.com/wiseant/p/3729753.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!