public IQueryable <T> GetData <T>()
            where T : class, IData
        {
            CheckTransactionNotInAbortedState();

            XmlDataTypeStore dataTypeStore = _xmlDataTypeStoresContainer.GetDataTypeStore(typeof(T));

            var currentDataScope = DataScopeManager.MapByType(typeof(T));

            if (!dataTypeStore.HasDataScopeName(currentDataScope))
            {
                return(Enumerable.Empty <T>().AsQueryable());
            }

            var dataTypeStoreScope = dataTypeStore.GetDataScopeForType(typeof(T));

            var fileRecord = XmlDataProviderDocumentCache.GetFileRecord(
                dataTypeStoreScope.Filename,
                dataTypeStoreScope.ElementName,
                dataTypeStore.Helper.CreateDataId);

            if (fileRecord.CachedTable == null)
            {
                ICollection <XElement> elements = fileRecord.ReadOnlyElementsList;

                Func <XElement, T> fun = dataTypeStore.Helper.CreateSelectFunction <T>(_dataProviderContext.ProviderName);

                var list = new List <T>(elements.Count);
                list.AddRange(elements.Select(fun));

                fileRecord.CachedTable = new CachedTable <T>(list);
            }

            return(new CachingQueryable <T>(fileRecord.CachedTable, () => fileRecord.CachedTable.Queryable));
        }
        public List <T> AddNew <T>(IEnumerable <T> dataset) where T : class, IData
        {
            Verify.ArgumentNotNull(dataset, "dataset");

            CheckTransactionNotInAbortedState();

            var resultList = new List <T>();

            using (XmlDataProviderDocumentCache.CreateEditingContext())
            {
                XmlDataTypeStore dataTypeStore = _xmlDataTypeStoresContainer.GetDataTypeStore(typeof(T));
                var dataTypeStoreScope         = dataTypeStore.GetDataScopeForType(typeof(T));

                var fileRecord = GetFileRecord(dataTypeStore, dataTypeStoreScope);

                var validatedElements = new Dictionary <DataSourceId, XElement>();

                // validating phase
                foreach (IData data in dataset)
                {
                    Verify.ArgumentCondition(data != null, nameof(dataset), "The enumeration dataset may not contain nulls");
                    ValidationHelper.Validate(data);

                    XElement newElement;

                    T        newData          = dataTypeStore.Helper.CreateNewElement <T>(data, out newElement, dataTypeStoreScope.ElementName, _dataProviderContext.ProviderName);
                    IDataId  dataId           = dataTypeStore.Helper.CreateDataId(newElement);
                    XElement violatingElement = fileRecord.RecordSet.Index[dataId];

                    if (violatingElement != null)
                    {
                        throw new ArgumentException(nameof(dataset), "Key violation error. A data element with the same dataId is already added. Type: " + typeof(T).FullName);
                    }

                    validatedElements.Add(newData.DataSourceId, newElement);
                    resultList.Add(newData);
                }

                // commit validated elements
                foreach (var key in validatedElements.Keys)
                {
                    fileRecord.RecordSet.Index.Add(key.DataId, validatedElements[key]);
                    fileRecord.Dirty = true;
                }

                XmlDataProviderDocumentCache.SaveChanges();

                SubscribeToTransactionRollbackEvent();
            }

            return(resultList);
        }
        public T GetData <T>(IDataId dataId)
            where T : class, IData
        {
            if (dataId == null)
            {
                throw new ArgumentNullException("dataId");
            }

            XmlDataTypeStore dataTypeStore = _xmlDataTypeStoresContainer.GetDataTypeStore(typeof(T));
            var dataTypeStoreScope         = dataTypeStore.GetDataScopeForType(typeof(T));

            var fileRecord = GetFileRecord(dataTypeStore, dataTypeStoreScope);

            XElement element = fileRecord.RecordSet.Index[dataId];

            if (element == null)
            {
                return(null);
            }

            Func <XElement, T> selectFun = dataTypeStore.Helper.CreateSelectFunction <T>(_dataProviderContext.ProviderName);

            return(selectFun(element));
        }