CompiledQueryCacheEntry.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Common / QueryCache / CompiledQueryCacheEntry.cs / 1305376 / CompiledQueryCacheEntry.cs

                            //------------------------------------------------------------------------------ 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner  [....]
// @backupOwner [....] 
//----------------------------------------------------------------------------- 

namespace System.Data.Common.QueryCache 
{
    using System;
    using System.Data.Metadata.Edm;
    using System.Data.Objects; 
    using System.Data.Objects.Internal;
    using System.Diagnostics; 
    using System.Threading; 

    ///  
    /// Represents a compiled LINQ ObjectQuery cache entry
    /// 
    internal sealed class CompiledQueryCacheEntry : QueryCacheEntry
    { 
        /// 
        /// The merge option that was inferred during expression conversion. 
        ///  
        public readonly MergeOption? PropagatedMergeOption;
 
        /// 
        /// The execution plan to use for the 'AppendOnly' merge option.
        /// 
        private ObjectQueryExecutionPlan _appendOnlyPlan; 

        ///  
        /// The execution plan to use for the 'NoTracking' merge option. 
        /// 
        private ObjectQueryExecutionPlan _noTrackingPlan; 

        /// 
        /// The execution plan to use for the 'OverwriteChanges' merge option.
        ///  
        private ObjectQueryExecutionPlan _overwriteChangesPlan;
 
        ///  
        /// The execution plan to use for the 'PreserveChanges' merge option.
        ///  
        private ObjectQueryExecutionPlan _preserveChangesPlan;

        #region Constructors
        ///  
        /// constructor
        ///  
        /// The cache key that targets this cache entry 
        ///The inferred merge option that applies to this cached query
        internal CompiledQueryCacheEntry(QueryCacheKey queryCacheKey, MergeOption? mergeOption) 
            : base(queryCacheKey, null)
        {
            this.PropagatedMergeOption = mergeOption;
        } 
        #endregion
 
        #region Methods/Properties 

        ///  
        /// Retrieves the execution plan for the specified merge option. May return null if the plan for that merge option has yet to be populated.
        /// 
        /// The merge option for which an execution plan is required.
        /// The corresponding execution plan, if it exists; otherwise null. 
        internal ObjectQueryExecutionPlan GetExecutionPlan(MergeOption mergeOption)
        { 
            switch(mergeOption) 
            {
                case MergeOption.AppendOnly: 
                    return this._appendOnlyPlan;

                case MergeOption.NoTracking:
                    return this._noTrackingPlan; 

                case MergeOption.OverwriteChanges: 
                    return this._overwriteChangesPlan; 

                case MergeOption.PreserveChanges: 
                    return this._preserveChangesPlan;

                default:
                    throw EntityUtil.ArgumentOutOfRange("mergeOption"); 
            }
        } 
 
        /// 
        /// Attempts to set the execution plan for 's merge option on this cache entry to . 
        /// If a plan already exists for that merge option, the current value is not changed but is returned to the caller.
        /// Otherwise  is returned to the caller.
        /// 
        /// The new execution plan to add to this cache entry. 
        /// The execution plan that corresponds to 's merge option, which may be  or may be a previously added execution plan.
        internal ObjectQueryExecutionPlan SetExecutionPlan(ObjectQueryExecutionPlan newPlan) 
        { 
            Debug.Assert(newPlan != null, "New plan cannot be null");
 
            ObjectQueryExecutionPlan currentPlan;

            switch(newPlan.MergeOption)
            { 
                case MergeOption.AppendOnly:
                    currentPlan = Interlocked.CompareExchange(ref _appendOnlyPlan, newPlan, null); 
                    break; 

                case MergeOption.NoTracking: 
                    currentPlan = Interlocked.CompareExchange(ref _noTrackingPlan, newPlan, null);
                    break;

                case MergeOption.OverwriteChanges: 
                    currentPlan = Interlocked.CompareExchange(ref _overwriteChangesPlan, newPlan, null);
                    break; 
 
                case MergeOption.PreserveChanges:
                    currentPlan = Interlocked.CompareExchange(ref _preserveChangesPlan, newPlan, null); 
                    break;

                default:
                    throw EntityUtil.ArgumentOutOfRange("newPlan.MergeOption"); 
            }
 
            return (currentPlan ?? newPlan); 
        }
 
        /// 
        /// Convenience method to retrieve the result type from the first non-null execution plan found on this cache entry.
        /// 
        /// The result type of any execution plan that is or could be added to this cache entry 
        /// true if at least one execution plan was present and a result type could be retrieved; otherwise false
        internal bool TryGetResultType(out TypeUsage resultType) 
        { 
            // AppendOnly - the default
            ObjectQueryExecutionPlan plan = this._appendOnlyPlan; 
            if (plan != null)
            {
                resultType = plan.ResultType;
                return true; 
            }
 
            // NoTracking 
            plan = this._noTrackingPlan;
            if (plan != null) 
            {
                resultType = plan.ResultType;
                return true;
            } 

            // OverwriteChanges 
            plan = this._overwriteChangesPlan; 
            if (plan != null)
            { 
                resultType = plan.ResultType;
                return true;
            }
 
            // PreserveChanges
            plan = this._preserveChangesPlan; 
            if (plan != null) 
            {
                resultType = plan.ResultType; 
                return true;
            }

            // No plan is present 
            resultType = null;
            return false; 
        } 

        #endregion 
    }
}

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.


                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK