예제 #1
0
 /// <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()));
 }
예제 #2
0
 /// <summary>
 /// Construtor padrão.
 /// </summary>
 /// <param name="dataSource">Fonte de dados</param>
 public SqlSourceContext(IQueryDataSource dataSource)
 {
     dataSource.Require("dataSource").NotNull();
     _dataSource = dataSource;
 }
예제 #3
0
        /// <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);
        }