コード例 #1
0
        /// <summary>
        /// execute query
        /// </summary>
        /// <typeparam name="T">data type</typeparam>
        /// <param name="cmd">command</param>
        /// <returns>datas</returns>
        public async Task <IEnumerable <T> > QueryAsync <T>(ICommand cmd)
        {
            var servers = await GetServerAsync(cmd).ConfigureAwait(false);

            VerifyServerEngine(servers.Select(c => c.ServerType).ToArray());
            IEnumerable <T> dataList = null;

            if (servers.Count == 1)
            {
                var nowServer = servers[0];
                var engine    = DataManager.DbEngines[nowServer.ServerType];
                dataList = engine.Query <T>(nowServer, cmd);
            }
            else
            {
                bool notOrder      = cmd.Query == null || cmd.Query.Orders.IsNullOrEmpty();
                int  dataSize      = cmd.Query?.QuerySize ?? 0;
                var  entityCompare = new EntityCompare <T>();
                foreach (var server in servers)
                {
                    var engine      = DataManager.DbEngines[server.ServerType];
                    var newDataList = await engine.QueryAsync <T>(server, cmd).ConfigureAwait(false);

                    dataList = dataList == null ? newDataList : dataList.Union(newDataList, entityCompare);//merge data
                    if (dataSize > 0 && dataList.Count() >= dataSize && notOrder)
                    {
                        return(dataList.Take(dataSize));
                    }
                }
                if (!notOrder)
                {
                    dataList = cmd.Query.Order(dataList);
                }
                if (dataSize > 0 && dataList.Count() > dataSize)
                {
                    dataList = dataList.Take(dataSize);
                }
            }
            return(dataList);
        }
コード例 #2
0
        /// <summary>
        /// Query datas
        /// </summary>
        /// <typeparam name="T">Data type</typeparam>
        /// <param name="command">Command</param>
        /// <returns>Return datas</returns>
        public async Task <IEnumerable <T> > QueryAsync <T>(ICommand command)
        {
            var servers = GetServers(command);

            VerifyServerProvider(servers.Select(c => c.ServerType));
            IEnumerable <T> datas = null;

            if (servers.Count == 1)
            {
                var nowServer = servers[0];
                var provider  = DataManager.GetDatabaseProvider(nowServer.ServerType);
                datas = provider.Query <T>(nowServer, command);
            }
            else
            {
                bool notOrder      = command.Query == null || command.Query.Orders.IsNullOrEmpty();
                int  dataSize      = command.Query?.QuerySize ?? 0;
                var  entityCompare = new EntityCompare <T>();
                Task <IEnumerable <T> >[] queryTasks = new Task <IEnumerable <T> > [servers.Count];
                int serverIndex = 0;
                foreach (var server in servers)
                {
                    var provider = DataManager.GetDatabaseProvider(server.ServerType);
                    queryTasks[serverIndex] = provider.QueryAsync <T>(server, command);
                    serverIndex++;
                }
                datas = (await Task.WhenAll(queryTasks).ConfigureAwait(false)).SelectMany(c => c).Distinct(entityCompare);
                if (!notOrder)
                {
                    datas = command.Query.Sort(datas);
                }
                if (dataSize > 0 && datas.Count() > dataSize)
                {
                    datas = datas.Take(dataSize);
                }
            }
            return(datas);
        }