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