/// <summary> /// Executa a consulta. /// </summary> /// <returns>Resultado na forma de um vetor de <see cref="QueryResult"/></returns> public IEnumerable <IQueryResult> Execute(IQueryDataSource dataSource) { dataSource.Require("dataSource").NotNull(); return(dataSource.Execute(CreateQueryInfos())); }
/// <summary> /// Construtor padrão. /// </summary> /// <param name="dataSource">Fonte de dados</param> public SqlSourceContext(IQueryDataSource dataSource) { dataSource.Require("dataSource").NotNull(); _dataSource = dataSource; }
/// <summary> /// Executa a consulta. /// </summary> /// <returns>Resultado na forma de um vetor de <see cref="QueryResult"/></returns> public IEnumerable <IQueryResult> Execute() { _dataSource.Require("_dataSource").NotNull(); QueryInfo[] info = CreateQueryInfos(); IEnumerable <IQueryResult> result = null; try { result = _dataSource.Execute(info); } catch (Exception ex) { for (int i = 0; i < _queries.Count; i++) { QueryCallBackWrapper callback; if (_callbacks.TryGetValue(i, out callback)) { callback.ExecuteFailedCallBack(this, info[i], new QueryFailedInfo(QueryFailedReason.Error, ex.Message.GetFormatter(), ex)); } } throw; } for (int i = 0; i < _queries.Count; i++) { _queries[i].Parameters = info[i].Parameters; } if (_callbacks.Where(f => f.Value != null).Any()) { var result2 = new List <IQueryResult>(); try { var position = 0; var processed = 0; using (var resultEnumerator = result.GetEnumerator()) { for (processed = 0; processed < _queries.Count && resultEnumerator.MoveNext(); processed++) { for (position = 0; position < info.Length; position++) { if (info[position].Id == resultEnumerator.Current.Id) { break; } } QueryCallBackWrapper callback; if (_callbacks.TryGetValue(position, out callback)) { var queryResult = resultEnumerator.Current; callback.ExecuteCallBack(this, info[position], queryResult); result2.Add(new QueryResult()); } else { using (var recordEnumerator = resultEnumerator.Current.GetEnumerator()) { if (recordEnumerator.MoveNext()) { var records = new List <Record>(); records.Add(recordEnumerator.Current); while (recordEnumerator.MoveNext()) { records.Add(recordEnumerator.Current); } result2.Add(new QueryResult(records[0].Descriptor, records, _queries[position])); } else { result2.Add(new QueryResult()); } } } } if (processed < _queries.Count) { throw new QueryException(ResourceMessageFormatter.Create(() => Properties.Resources.MultiQueryable_MultiQueryableExecuteErrorProcess).Format()); } } } finally { if (result is IDisposable) { if (!(result is IDisposableState) || !((IDisposableState)result).IsDisposed) { ((IDisposable)result).Dispose(); } } } result = result2; } return(result); }