Created
September 30, 2020 17:16
-
-
Save angusbreno/9bb08a7fec6f6d97a57db27f709e53b8 to your computer and use it in GitHub Desktop.
Cosmos Tools SQL API
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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