ObjectViewQueryResultData.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Objects / ObjectViewQueryResultData.cs / 1305376 / ObjectViewQueryResultData.cs

                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner       [....]
// @backupOwner [....] 
//--------------------------------------------------------------------- 
using System;
using System.Collections; 
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common; 
using System.Data.Metadata;
using System.Data.Metadata.Edm; 
using System.Data.Objects.DataClasses; 
using System.Diagnostics;
 
namespace System.Data.Objects
{
    /// 
    /// Manages a binding list constructed from query results. 
    /// 
    ///  
    /// Type of the elements in the binding list. 
    /// 
    ///  
    /// The binding list is initialized from query results.
    /// If the binding list can be modified,
    /// objects are added or removed from the ObjectStateManager (via the ObjectContext).
    ///  
    internal sealed class ObjectViewQueryResultData : IObjectViewData
    { 
        private List _bindingList; 

        ///  
        /// ObjectContext used to add or delete objects when the list can be modified.
        /// 
        private ObjectContext _objectContext;
 
        /// 
        /// If the TElement type is an Entity type of some kind, 
        /// this field specifies the entity set to add entity objects. 
        /// 
        private EntitySet _entitySet; 

        private bool _canEditItems;
        private bool _canModifyList;
 
        /// 
        /// Construct a new instance of the ObjectViewQueryResultData class using the supplied query results. 
        ///  
        /// 
        /// Result of object query execution used to populate the binding list. 
        /// 
        /// 
        /// ObjectContext used to add or remove items.
        /// If the binding list can be modified, this parameter should not be null. 
        /// 
        ///  
        /// True if items should not be allowed to be added or removed from the binding list. 
        /// Note that other conditions may prevent the binding list from being modified, so a value of false
        /// supplied for this parameter doesn't necessarily mean that the list will be writable. 
        /// 
        /// 
        /// If the TElement type is an Entity type of some kind,
        /// this field specifies the entity set to add entity objects. 
        /// 
        internal ObjectViewQueryResultData(IEnumerable queryResults, ObjectContext objectContext, bool forceReadOnlyList, EntitySet entitySet) 
        { 
            bool canTrackItemChanges = IsEditable(typeof(TElement));
 
            _objectContext = objectContext;
            _entitySet = entitySet;

            _canEditItems = canTrackItemChanges; 
            _canModifyList = !forceReadOnlyList && canTrackItemChanges && _objectContext != null;
 
            _bindingList = new List(); 
            foreach (TElement element in queryResults)
            { 
                _bindingList.Add(element);
            }
        }
 
        /// 
        /// Cannot be a DbDataRecord or a derivative of DbDataRecord 
        ///  
        /// 
        ///  
        private bool IsEditable(Type elementType)
        {
            return !((elementType == typeof(DbDataRecord)) ||
                     ((elementType != typeof(DbDataRecord)) && elementType.IsSubclassOf(typeof(DbDataRecord)))); 
        }
 
        ///  
        /// Throw an exception is an entity set was not specified for this instance.
        ///  
        private void EnsureEntitySet()
        {
            if (_entitySet == null)
            { 
                throw EntityUtil.CannotResolveTheEntitySetforGivenEntity(typeof(TElement));
            } 
        } 

        #region IObjectViewData Members 

        public IList List
        {
            get { return _bindingList; } 
        }
 
        public bool AllowNew 
        {
            get { return _canModifyList && _entitySet != null; } 
        }

        public bool AllowEdit
        { 
            get { return _canEditItems; }
        } 
 
        public bool AllowRemove
        { 
            get { return _canModifyList; }
        }

        public bool FiresEventOnAdd 
        {
            get { return false; } 
        } 

        public bool FiresEventOnRemove 
        {
            get { return true; }
        }
 
        public bool FiresEventOnClear
        { 
            get { return false; } 
        }
 
        public void EnsureCanAddNew()
        {
            EnsureEntitySet();
        } 

        public int Add(TElement item, bool isAddNew) 
        { 
            EnsureEntitySet();
 
            Debug.Assert(_objectContext != null, "ObjectContext is null.");

            // If called for AddNew operation, add item to binding list, pending addition to ObjectContext.
            if (!isAddNew) 
            {
                _objectContext.AddObject(TypeHelpers.GetFullName(_entitySet), item); 
            } 

            _bindingList.Add(item); 

            return _bindingList.Count - 1;
        }
 
        public void CommitItemAt(int index)
        { 
            EnsureEntitySet(); 

            Debug.Assert(_objectContext != null, "ObjectContext is null."); 

            TElement item = _bindingList[index];
            _objectContext.AddObject(TypeHelpers.GetFullName(_entitySet), item);
        } 

        public void Clear() 
        { 
            while (0 < _bindingList.Count)
            { 
                TElement entity = _bindingList[_bindingList.Count - 1];

                Remove(entity, false);
            } 
        }
 
        public bool Remove(TElement item, bool isCancelNew) 
        {
            bool removed; 

            Debug.Assert(_objectContext != null, "ObjectContext is null.");

            if (isCancelNew) 
            {
                // Item was previously added to binding list, but not ObjectContext. 
                removed = _bindingList.Remove(item); 
            }
            else 
            {
                EntityEntry stateEntry = _objectContext.ObjectStateManager.FindEntityEntry(item);

                if (stateEntry != null) 
                {
                    stateEntry.Delete(); 
                    // OnCollectionChanged event will be fired, where the binding list will be updated. 
                    removed = true;
                } 
                else
                {
                    removed = false;
                } 
            }
 
            return removed; 
        }
 
        public ListChangedEventArgs OnCollectionChanged(object sender, CollectionChangeEventArgs e, ObjectViewListener listener)
        {
            ListChangedEventArgs changeArgs = null;
 
            // Since event is coming from cache and it might be shared amoung different queries
            // we have to check to see if correct event is being handled. 
            if (e.Element.GetType().IsAssignableFrom(typeof(TElement)) && 
                _bindingList.Contains((TElement)(e.Element)))
            { 
                TElement item = (TElement)e.Element;
                int itemIndex = _bindingList.IndexOf(item);

                if (itemIndex >= 0) // Ignore entities that we don't know about. 
                {
                    // Only process "remove" events. 
                    Debug.Assert(e.Action != CollectionChangeAction.Refresh, "Cache should never fire with refresh, it does not have clear"); 

                    if (e.Action == CollectionChangeAction.Remove) 
                    {
                        _bindingList.Remove(item);

                        listener.UnregisterEntityEvents(item); 

                        changeArgs = new ListChangedEventArgs(ListChangedType.ItemDeleted, itemIndex /* newIndex*/, -1 /* oldIndex*/); 
                    } 
                }
            } 

            return changeArgs;
        }
 
        #endregion
    } 
} 

// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner       [....]
// @backupOwner [....] 
//--------------------------------------------------------------------- 
using System;
using System.Collections; 
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common; 
using System.Data.Metadata;
using System.Data.Metadata.Edm; 
using System.Data.Objects.DataClasses; 
using System.Diagnostics;
 
namespace System.Data.Objects
{
    /// 
    /// Manages a binding list constructed from query results. 
    /// 
    ///  
    /// Type of the elements in the binding list. 
    /// 
    ///  
    /// The binding list is initialized from query results.
    /// If the binding list can be modified,
    /// objects are added or removed from the ObjectStateManager (via the ObjectContext).
    ///  
    internal sealed class ObjectViewQueryResultData : IObjectViewData
    { 
        private List _bindingList; 

        ///  
        /// ObjectContext used to add or delete objects when the list can be modified.
        /// 
        private ObjectContext _objectContext;
 
        /// 
        /// If the TElement type is an Entity type of some kind, 
        /// this field specifies the entity set to add entity objects. 
        /// 
        private EntitySet _entitySet; 

        private bool _canEditItems;
        private bool _canModifyList;
 
        /// 
        /// Construct a new instance of the ObjectViewQueryResultData class using the supplied query results. 
        ///  
        /// 
        /// Result of object query execution used to populate the binding list. 
        /// 
        /// 
        /// ObjectContext used to add or remove items.
        /// If the binding list can be modified, this parameter should not be null. 
        /// 
        ///  
        /// True if items should not be allowed to be added or removed from the binding list. 
        /// Note that other conditions may prevent the binding list from being modified, so a value of false
        /// supplied for this parameter doesn't necessarily mean that the list will be writable. 
        /// 
        /// 
        /// If the TElement type is an Entity type of some kind,
        /// this field specifies the entity set to add entity objects. 
        /// 
        internal ObjectViewQueryResultData(IEnumerable queryResults, ObjectContext objectContext, bool forceReadOnlyList, EntitySet entitySet) 
        { 
            bool canTrackItemChanges = IsEditable(typeof(TElement));
 
            _objectContext = objectContext;
            _entitySet = entitySet;

            _canEditItems = canTrackItemChanges; 
            _canModifyList = !forceReadOnlyList && canTrackItemChanges && _objectContext != null;
 
            _bindingList = new List(); 
            foreach (TElement element in queryResults)
            { 
                _bindingList.Add(element);
            }
        }
 
        /// 
        /// Cannot be a DbDataRecord or a derivative of DbDataRecord 
        ///  
        /// 
        ///  
        private bool IsEditable(Type elementType)
        {
            return !((elementType == typeof(DbDataRecord)) ||
                     ((elementType != typeof(DbDataRecord)) && elementType.IsSubclassOf(typeof(DbDataRecord)))); 
        }
 
        ///  
        /// Throw an exception is an entity set was not specified for this instance.
        ///  
        private void EnsureEntitySet()
        {
            if (_entitySet == null)
            { 
                throw EntityUtil.CannotResolveTheEntitySetforGivenEntity(typeof(TElement));
            } 
        } 

        #region IObjectViewData Members 

        public IList List
        {
            get { return _bindingList; } 
        }
 
        public bool AllowNew 
        {
            get { return _canModifyList && _entitySet != null; } 
        }

        public bool AllowEdit
        { 
            get { return _canEditItems; }
        } 
 
        public bool AllowRemove
        { 
            get { return _canModifyList; }
        }

        public bool FiresEventOnAdd 
        {
            get { return false; } 
        } 

        public bool FiresEventOnRemove 
        {
            get { return true; }
        }
 
        public bool FiresEventOnClear
        { 
            get { return false; } 
        }
 
        public void EnsureCanAddNew()
        {
            EnsureEntitySet();
        } 

        public int Add(TElement item, bool isAddNew) 
        { 
            EnsureEntitySet();
 
            Debug.Assert(_objectContext != null, "ObjectContext is null.");

            // If called for AddNew operation, add item to binding list, pending addition to ObjectContext.
            if (!isAddNew) 
            {
                _objectContext.AddObject(TypeHelpers.GetFullName(_entitySet), item); 
            } 

            _bindingList.Add(item); 

            return _bindingList.Count - 1;
        }
 
        public void CommitItemAt(int index)
        { 
            EnsureEntitySet(); 

            Debug.Assert(_objectContext != null, "ObjectContext is null."); 

            TElement item = _bindingList[index];
            _objectContext.AddObject(TypeHelpers.GetFullName(_entitySet), item);
        } 

        public void Clear() 
        { 
            while (0 < _bindingList.Count)
            { 
                TElement entity = _bindingList[_bindingList.Count - 1];

                Remove(entity, false);
            } 
        }
 
        public bool Remove(TElement item, bool isCancelNew) 
        {
            bool removed; 

            Debug.Assert(_objectContext != null, "ObjectContext is null.");

            if (isCancelNew) 
            {
                // Item was previously added to binding list, but not ObjectContext. 
                removed = _bindingList.Remove(item); 
            }
            else 
            {
                EntityEntry stateEntry = _objectContext.ObjectStateManager.FindEntityEntry(item);

                if (stateEntry != null) 
                {
                    stateEntry.Delete(); 
                    // OnCollectionChanged event will be fired, where the binding list will be updated. 
                    removed = true;
                } 
                else
                {
                    removed = false;
                } 
            }
 
            return removed; 
        }
 
        public ListChangedEventArgs OnCollectionChanged(object sender, CollectionChangeEventArgs e, ObjectViewListener listener)
        {
            ListChangedEventArgs changeArgs = null;
 
            // Since event is coming from cache and it might be shared amoung different queries
            // we have to check to see if correct event is being handled. 
            if (e.Element.GetType().IsAssignableFrom(typeof(TElement)) && 
                _bindingList.Contains((TElement)(e.Element)))
            { 
                TElement item = (TElement)e.Element;
                int itemIndex = _bindingList.IndexOf(item);

                if (itemIndex >= 0) // Ignore entities that we don't know about. 
                {
                    // Only process "remove" events. 
                    Debug.Assert(e.Action != CollectionChangeAction.Refresh, "Cache should never fire with refresh, it does not have clear"); 

                    if (e.Action == CollectionChangeAction.Remove) 
                    {
                        _bindingList.Remove(item);

                        listener.UnregisterEntityEvents(item); 

                        changeArgs = new ListChangedEventArgs(ListChangedType.ItemDeleted, itemIndex /* newIndex*/, -1 /* oldIndex*/); 
                    } 
                }
            } 

            return changeArgs;
        }
 
        #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