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