예제 #1
0
 public ModelStep(Query query, DbParameterCollection parameters, QueryResultModelHandler <TArg, TModel> resultHandler, TArg optionalArgument)
 {
     _isTopOne         = false;
     _query            = query;
     _resultHandler    = resultHandler;
     _parameters       = parameters;
     _optionalArgument = optionalArgument;
 }
예제 #2
0
 public ModelStep(Query query, DbParameterCollection parameters, QueryResultModelHandler <TArg, TModel> resultHandler, bool isTopOne)
 {
     _isTopOne         = isTopOne;
     _query            = query;
     _resultHandler    = resultHandler;
     _parameters       = parameters;
     _optionalArgument = default(TArg);
 }
예제 #3
0
 public static ShardBatch <TModel> Add <TModel>(this ShardBatch <TModel> batch, Query query, QueryResultModelHandler <object, TModel> resultHandler) where TModel : class, new()
 {
     batch.Add(new ModelStep <object, TModel>(query, new ParameterCollection(), resultHandler, null));
     return(batch);
 }
예제 #4
0
 public static ShardBatch <TModel> Add <TArg, TModel>(this ShardBatch <TModel> batch, Query query, QueryResultModelHandler <TArg, TModel> resultHandler, TArg optionalArgument) where TModel : class, new()
 {
     batch.Add(new ModelStep <TArg, TModel>(query, new ParameterCollection(), resultHandler, optionalArgument));
     return(batch);
 }
예제 #5
0
 public static DatabaseBatch <TModel> Add <TModel>(this DatabaseBatch <TModel> batch, Query query, DbParameterCollection parameters, QueryResultModelHandler <object, TModel> resultHandler) where TModel : class, new()
 {
     batch.Add(new ModelStep <object, TModel>(query, parameters, resultHandler, null));
     return(batch);
 }
예제 #6
0
 public static DatabaseBatch <TModel> Add <TArg, TModel>(this DatabaseBatch <TModel> batch, Query query, DbParameterCollection parameters, QueryResultModelHandler <TArg, TModel> resultHandler, TArg optionalArgument) where TModel : class, new()
 {
     batch.Add(new ModelStep <TArg, TModel>(query, parameters, resultHandler, optionalArgument));
     return(batch);
 }
예제 #7
0
            internal async Task <List <TModel> > ReadQueryAllAsync <TArg, TModel>(Query query, DbParameterCollection parameters, ShardsValues shardParameterValues, string shardParameterName, QueryResultModelHandler <TArg, TModel> resultHandler, TArg dataObject, CancellationToken cancellationToken)
            {
                var result = new List <TModel>();

                if (query is null || string.IsNullOrEmpty(query.Sql) || string.IsNullOrEmpty(query.Name))
                {
                    throw new ArgumentNullException(nameof(query));
                }
                if (parameters == null)
                {
                    throw new ArgumentNullException(nameof(parameters));
                }
                if (!(this.MockResults is null) && this.MockResults.Count > 0 && this.MockResults.ContainsKey(query.Name))
                {
                    return((List <TModel>) this.MockResults[query.Name]);
                }
                var shardParameterOrdinal = parameters.GetParameterOrdinal(shardParameterName);

                cancellationToken.ThrowIfCancellationRequested();

                var tsks = new List <Task <TModel> >();
                var cancelTokenSource = new CancellationTokenSource();

                using (var queryCancelationToken = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, cancelTokenSource.Token))
                {
                    if (shardParameterValues is null)
                    {
                        foreach (var shardId in dtn.Keys)
                        {
                            parameters.SetShardId(shardParameterOrdinal, shardId);
                            tsks.Add(this.dtn[shardId].Read._manager.QueryAsync <TArg, TModel>(query, parameters, parameters.GetParameterOrdinal(shardParameterName), null, resultHandler, false, dataObject, null, cancellationToken));
                        }
                    }
                    else
                    {
                        if (shardParameterValues.Shards.Count == 0)
                        {
                            return(result);
                        }
                        foreach (var shardTuple in shardParameterValues.Shards)
                        {
                            parameters.SetShardId(shardParameterOrdinal, shardTuple.Key);
                            tsks.Add(this.dtn[shardTuple.Key].Read._manager.QueryAsync <TArg, TModel>(query, parameters, parameters.GetParameterOrdinal(shardParameterName), shardTuple.Value, resultHandler, false, dataObject, null, cancellationToken));
                        }
                    }
                    await Task.WhenAll(tsks).ConfigureAwait(false);

                    foreach (var tsk in tsks)
                    {
                        var tskResult = tsk.Result;
                        if (tskResult != null)
                        {
                            result.Add(tskResult);
                        }
                    }
                }
                return(result);
            }