Skip to content

Instantly share code, notes, and snippets.

@angusbreno
Created September 30, 2020 17:16
Show Gist options
  • Save angusbreno/9bb08a7fec6f6d97a57db27f709e53b8 to your computer and use it in GitHub Desktop.
Save angusbreno/9bb08a7fec6f6d97a57db27f709e53b8 to your computer and use it in GitHub Desktop.
Cosmos Tools SQL API
public class CosmosContainerRepository<TEntity> : IRepository<TEntity> where TEntity : IEntity<string>, IModifiable, new()
{
private readonly Container container;
public CosmosContainerRepository(Container container, Func<TEntity, PartitionKey> partitionKeyResolver)
{
this.container = container;
PartitionKeyResolver = partitionKeyResolver;
}
public Func<TEntity, PartitionKey> PartitionKeyResolver { get; set; }
public void Create(TEntity entity)
{
entity.UpdateCreatedAt();
var r = container.CreateItemAsync(entity, PartitionKeyResolver.Invoke(entity)).Result;
}
public void AddRange(IEnumerable<TEntity> entities)
{
var r = entities.Select(entity => container.CreateItemAsync(entity, PartitionKeyResolver.Invoke(entity)).Result);
}
public void Update(TEntity entity)
{
entity.UpdateUpdateAt();
var r = container.UpsertItemAsync(entity, PartitionKeyResolver.Invoke(entity)).Result;
}
public void Delete(TEntity entity)
{
if (entity == null)
{
throw new Exception("Entity not found");
}
var r = container.DeleteItemAsync<TEntity>(entity.Id, PartitionKeyResolver.Invoke(entity)).Result;
}
public void Delete(string id)
{
throw new NotImplementedException();
//var r = container.DeleteItemAsync<TEntity>(id, PartitionKey.None).Result;
}
public IEnumerable<TEntity> Get(Expression<Func<TEntity, bool>> filter = null, Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, Expression<Func<TEntity, object>>[] includes = null, int? skip = null, int? take = null)
{
var q = GetAllAsQueryable(includes).Where(filter);
if (skip != null)
{
q = q.Skip(skip.Value);
}
if (take != null)
{
q = q.Take(take.Value);
}
return orderBy?.Invoke(q) ?? q.AsEnumerable();
}
public IEnumerable<TEntity> GetAll(Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null, Expression<Func<TEntity, object>>[] includes = null, int? skip = null, int? take = null)
{
var q = GetAllAsQueryable(includes);
if (skip != null)
{
q = q.Skip(skip.Value);
}
if (take != null)
{
q = q.Take(take.Value);
}
return orderBy?.Invoke(q) ?? q.AsEnumerable();
}
public IQueryable<TEntity> GetAllAsQueryable(params Expression<Func<TEntity, object>>[] includes)
{
var q = container.GetItemLinqQueryable<TEntity>(true);
return q;
}
public TEntity GetById(string id, Expression<Func<TEntity, object>>[] includes = null)
{
return Get(x => x.Id == id).ToList().FirstOrDefault();
}
public int GetCount(Expression<Func<TEntity, bool>> filter = null)
{
if (filter != null)
{
throw new NotImplementedException();
}
var countSql = "SELECT VALUE COUNT(1) FROM c";
var countIterator = container.GetItemQueryIterator<int>(countSql);
while (countIterator.HasMoreResults)
{
var response = countIterator.ReadNextAsync().Result;
return response.FirstOrDefault();
}
return 0;
}
public bool GetExists(Expression<Func<TEntity, bool>> filter = null)
{
return Get(filter).FirstOrDefault() != null;
}
public void Save()
{
//
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment