|
@@ -49,14 +49,6 @@ public interface IProvider
|
|
|
/// <summary>
|
|
|
/// Same as <see cref="Query{T}(Filter{T}, Columns{T}, SortOrder{T}, CoreRange, bool, bool)"/>, but only for deleted items
|
|
|
/// </summary>
|
|
|
- /// <typeparam name="T"></typeparam>
|
|
|
- /// <param name="deletion"></param>
|
|
|
- /// <param name="filter"></param>
|
|
|
- /// <param name="columns"></param>
|
|
|
- /// <param name="sort"></param>
|
|
|
- /// <param name="range"></param>
|
|
|
- /// <param name="deleted"></param>
|
|
|
- /// <returns></returns>
|
|
|
CoreTable QueryDeleted<T>(Deletion deletion, Filter<T>? filter = null, Columns<T>? columns = null, SortOrder<T>? sort = null, CoreRange? range = null, bool deleted = false) where T : Entity, new();
|
|
|
|
|
|
T[] Load<T>(Filter<T>? filter = null, SortOrder<T>? sort = null, CoreRange? range = null) where T : Entity, new();
|
|
@@ -77,4 +69,42 @@ public interface IProvider
|
|
|
void Recover(Deletion deletion);
|
|
|
|
|
|
List<Type> GetDeletionTypes(Deletion deletion);
|
|
|
+}
|
|
|
+
|
|
|
+public static class ProviderExtensions
|
|
|
+{
|
|
|
+ public static void EnsureColumns<TEntity>(this IProvider provider, TEntity entity, Columns<TEntity> columns)
|
|
|
+ where TEntity : Entity, new()
|
|
|
+ {
|
|
|
+ var newColumns = Columns.None<TEntity>()
|
|
|
+ .AddRange(columns.Where(x => !entity.HasColumn(x.Property)));
|
|
|
+ if (newColumns.Count > 0)
|
|
|
+ {
|
|
|
+ var row = provider.Query(new Filter<TEntity>(x => x.ID).IsEqualTo(entity.ID), newColumns).Rows.FirstOrDefault();
|
|
|
+ row?.FillObject(entity);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void EnsureColumns<TEntity>(this IProvider provider, ICollection<TEntity> entities, Columns<TEntity> columns)
|
|
|
+ where TEntity : Entity, IRemotable, new()
|
|
|
+ {
|
|
|
+ var newColumns = Columns.None<TEntity>()
|
|
|
+ .AddRange(columns.Where(x => entities.Any(entity => !entity.HasColumn(x.Property))));
|
|
|
+ if (newColumns.Count > 0)
|
|
|
+ {
|
|
|
+ newColumns.Add(x => x.ID);
|
|
|
+ var table = provider.Query(new Filter<TEntity>(x => x.ID).InList(entities.Select(x => x.ID).ToArray()), newColumns);
|
|
|
+ foreach(var row in table.Rows)
|
|
|
+ {
|
|
|
+ var id = row.Get<TEntity, Guid>(x => x.ID);
|
|
|
+ var entity = entities.FirstOrDefault(x => x.ID == id);
|
|
|
+ if(entity is null)
|
|
|
+ {
|
|
|
+ // Shouldn't happen, but just in case.
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ row?.FillObject(entity);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|