|
@@ -8,7 +8,7 @@ using System.Threading;
|
|
|
using System.Threading.Tasks;
|
|
|
using System.Linq;
|
|
|
using Azure;
|
|
|
-using TEAMModelOS.SDK.DI.AzureCosmos.Inner;
|
|
|
+using TEAMModelOS.SDK.DI;
|
|
|
using System.IO;
|
|
|
using TEAMModelOS.SDK.DI;
|
|
|
using System.Diagnostics;
|
|
@@ -20,6 +20,7 @@ using TEAMModelOS.SDK;
|
|
|
using TEAMModelOS.SDK.Helper.Common.JsonHelper;
|
|
|
using TEAMModelOS.SDK.Extension;
|
|
|
using TEAMModelOS.SDK.Models;
|
|
|
+using TEAMModelOS.SDK.Models.Cosmos.OpenEntity;
|
|
|
|
|
|
namespace TEAMModelOS.SDK.DI
|
|
|
{
|
|
@@ -113,5 +114,85 @@ namespace TEAMModelOS.SDK.DI
|
|
|
}
|
|
|
return responses;
|
|
|
}
|
|
|
+ public static async Task<CosmosDBResult<T>> GetList<T>(this CosmosContainer container, QueryDefinition queryDefinition, string partitionkey, string? continuationToken = null, int? pageSize = null)
|
|
|
+ {
|
|
|
+ List<T> list = new List<T>();
|
|
|
+ double RU = 0;
|
|
|
+ if (string.IsNullOrWhiteSpace(partitionkey))
|
|
|
+ {
|
|
|
+ return (new CosmosDBResult<T> { list = list, ru = RU, continuationToken = continuationToken });
|
|
|
+ }
|
|
|
+
|
|
|
+ await foreach (var item in container.GetItemQueryStreamIterator(queryDefinition: queryDefinition, continuationToken: continuationToken,
|
|
|
+ requestOptions: new QueryRequestOptions { MaxItemCount = pageSize, PartitionKey = new PartitionKey(partitionkey) }))
|
|
|
+ {
|
|
|
+ using var json = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
+ if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ {
|
|
|
+ foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray())
|
|
|
+ {
|
|
|
+ list.Add(obj.ToObject<T>());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (queryDefinition.QueryText.Contains(" distinct ", StringComparison.OrdinalIgnoreCase) || queryDefinition.QueryText.Contains(" order by ", StringComparison.OrdinalIgnoreCase))
|
|
|
+ {
|
|
|
+ continuationToken = null;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ continuationToken = item.GetContinuationToken();
|
|
|
+ }
|
|
|
+ RU +=item.RU();
|
|
|
+ if (pageSize.HasValue && pageSize.Value >= 0 && list.Count >= pageSize)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //记录日志,RU开销大于400(开发测试),1000(正式)
|
|
|
+ return (new CosmosDBResult<T> { list = list, ru = RU, continuationToken = continuationToken }); ;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static async Task<CosmosDBResult<T>> GetList<T>(this CosmosContainer container, string sql, string partitionkey, string? continuationToken = null, int? pageSize = null)
|
|
|
+ {
|
|
|
+ List<T> list = new List<T>();
|
|
|
+ double RU = 0;
|
|
|
+ if (string.IsNullOrWhiteSpace(partitionkey))
|
|
|
+ {
|
|
|
+ return (new CosmosDBResult<T> { list = list, ru = RU, continuationToken = continuationToken });
|
|
|
+ }
|
|
|
+
|
|
|
+ await foreach (var item in container.GetItemQueryStreamIterator(queryText: sql, continuationToken: continuationToken,
|
|
|
+ requestOptions: new QueryRequestOptions { MaxItemCount = pageSize, PartitionKey = new PartitionKey(partitionkey) }) )
|
|
|
+ {
|
|
|
+ using var json = await JsonDocument.ParseAsync(item.ContentStream);
|
|
|
+ if (json.RootElement.TryGetProperty("_count", out JsonElement count) && count.GetUInt16() > 0)
|
|
|
+ {
|
|
|
+ foreach (var obj in json.RootElement.GetProperty("Documents").EnumerateArray()) {
|
|
|
+ list.Add(obj.ToObject<T>());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (sql.Contains(" distinct ", StringComparison.OrdinalIgnoreCase) || sql.Contains(" order by ", StringComparison.OrdinalIgnoreCase))
|
|
|
+ {
|
|
|
+ continuationToken = null;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ continuationToken = item.GetContinuationToken();
|
|
|
+ }
|
|
|
+ RU = item.RU();
|
|
|
+ if (pageSize.HasValue && pageSize.Value >= 0 && list.Count >= pageSize)
|
|
|
+ {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //记录日志,RU开销大于400(开发测试),1000(正式)
|
|
|
+ return (new CosmosDBResult<T> { list = list, ru = RU, continuationToken = continuationToken }); ;
|
|
|
+ }
|
|
|
+ public class CosmosDBResult<T>
|
|
|
+ {
|
|
|
+ public List<T>? list { get; set; }
|
|
|
+ public string? continuationToken { get; set; }
|
|
|
+ public double ru { get; set; }
|
|
|
+ }
|
|
|
}
|
|
|
}
|