Estoy transfiriendo mi biblioteca de clases existente que apunta a .NET Framework 4.6.2 a .NET Core 1.1.
Parece que algunos de los métodos que están disponibles en la versión de .NET Framework no están en .NET Core. Dos de estos métodos son table.CreateQuery y table.ExecuteQuery .
Aquí hay una función existente que me está dando un error para CreateQuery:
public T Get<T>(string partitionKey, string rowKey, string tableName) where T : ITableEntity, new() => getTable(tableName).CreateQuery<T>().Where(r => r.PartitionKey == partitionKey && r.RowKey == rowKey).FirstOrDefault();¿Cómo creo una consulta en .NET Core?
De acuerdo con esta pregunta: ¿ Faltan métodos síncronos para dotnet core?, el soporte de NetCore/Netstandard aún no incluye la implementación de sincronización de las API.
Dado que CreateQuery y ExecuteQuery son todos métodos de sincronización, por lo que no pudimos usarlos en .NET Core, solo puede usar ExecuteQuerySegmentedAsync,TableQuery, Fluent API y manejar el token de continuación que devuelve. Más detalles, puede consultar los siguientes códigos:
Actualizar:
public static void Main(string[] args) { var result = Get<BookTest3>("Aut_Fantasy", "Cert-0000000020", "DifferenetPartitionTest"); Console.Write(result.PartitionKey); Console.Read(); } public static T Get<T>(string partitionKey, string rowKey, string tableName) where T : ITableEntity, new() { CloudTable table = ConnectToTable(tableName); TableQuery<T> employeeQuery = new TableQuery<T>().Where( TableQuery.CombineFilters( TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey), TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThan, rowKey)) ).Take(1); var re = new T(); TableContinuationToken continuationToken = null; do { Task<TableQuerySegment<T>> employees = table.ExecuteQuerySegmentedAsync(employeeQuery, continuationToken); TableQuerySegment<T> employeess = employees.Result; re= employeess.FirstOrDefault(); continuationToken = employeess.ContinuationToken; } while (continuationToken != null); return re; }Espero que esto pueda darte algunos consejos.
Código de actualización:
public static void Main(string[] args) { var tas = Get<BookTest3>("Aut_Fantasy", "Cert-0000000020", "DifferenetPartitionTest"); var result = tas.Result; Console.Write(result.PartitionKey); Console.Read(); } public async static Task<T> Get<T>(string partitionKey, string rowKey, string tableName) where T : ITableEntity, new() { //new T(); CloudTable table = ConnectToTable(tableName); TableQuery<T> employeeQuery = new TableQuery<T>().Where( TableQuery.CombineFilters( TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey), TableOperators.And, TableQuery.GenerateFilterCondition("RowKey", QueryComparisons.LessThan, rowKey)) ).Take(1); var re = new T(); TableContinuationToken continuationToken = null; do { var employees = await table.ExecuteQuerySegmentedAsync(employeeQuery, continuationToken); re = employees.FirstOrDefault(); continuationToken = employees.ContinuationToken; } while (continuationToken != null); return re; }Agregaré estos prácticos métodos de extensión a esta publicación :)
public static async System.Threading.Tasks.Task<IEnumerable<DynamicTableEntity>> ExecuteQueryAsync(this CloudTable table, TableQuery query) { TableContinuationToken token = null; var retVal = new List<DynamicTableEntity>(); do { var results = await table.ExecuteQuerySegmentedAsync(query, token); retVal.AddRange(results.Results); token = results.ContinuationToken; } while (token != null); return retVal; } public static async System.Threading.Tasks.Task<IEnumerable<T>> ExecuteQueryAsync<T>(this CloudTable table, TableQuery<T> query) where T : ITableEntity, new() { TableContinuationToken token = null; var retVal = new List<T>(); do { var results = await table.ExecuteQuerySegmentedAsync(query, token); retVal.AddRange(results.Results); token = results.ContinuationToken; } while (token != null); return retVal; }Le devuelven la misma funcionalidad pero con ExecuteQueryASYNC como nombre del método