some batch actions, and added some methods while being there :)
This commit is contained in:
parent
e7383e75f6
commit
516d18314b
@ -20,5 +20,38 @@ namespace PoweredSoft.ObjectStorage.Core
|
|||||||
Task<TEntity> UpdateAsync(TEntity entity, CancellationToken cancellationToken = default(CancellationToken));
|
Task<TEntity> UpdateAsync(TEntity entity, CancellationToken cancellationToken = default(CancellationToken));
|
||||||
IQueryable<TEntity> AsQueryable();
|
IQueryable<TEntity> AsQueryable();
|
||||||
List<PropertyInfo> GetObjectKeys();
|
List<PropertyInfo> GetObjectKeys();
|
||||||
|
Task<bool> AnyAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default(CancellationToken));
|
||||||
|
Task<int> CountAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default(CancellationToken));
|
||||||
|
Task<long> LongCountAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default(CancellationToken));
|
||||||
|
Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default(CancellationToken));
|
||||||
|
Task<TEntity> FirstAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default(CancellationToken));
|
||||||
|
|
||||||
|
Task UpdateManyAsync<TField>(Expression<Func<TEntity, bool>> predicate,
|
||||||
|
Expression<Func<TEntity, TField>> fieldExpression, TField value,
|
||||||
|
CancellationToken cancellationToken = default);
|
||||||
|
|
||||||
|
Task UpdateManyAsync<TField, TField2>(Expression<Func<TEntity, bool>> predicate,
|
||||||
|
Expression<Func<TEntity, TField>> fieldExpression, TField value,
|
||||||
|
Expression<Func<TEntity, TField2>> fieldExpression2, TField2 value2,
|
||||||
|
CancellationToken cancellationToken = default);
|
||||||
|
|
||||||
|
Task UpdateManyAsync<TField, TField2, TField3>(Expression<Func<TEntity, bool>> predicate,
|
||||||
|
Expression<Func<TEntity, TField>> fieldExpression, TField value,
|
||||||
|
Expression<Func<TEntity, TField2>> fieldExpression2, TField2 value2,
|
||||||
|
Expression<Func<TEntity, TField3>> fieldExpression3, TField3 value3,
|
||||||
|
CancellationToken cancellationToken = default);
|
||||||
|
|
||||||
|
Task UpdateOneAsync<TField>(Expression<Func<TEntity, bool>> predicate,
|
||||||
|
Expression<Func<TEntity, TField>> fieldExpression, TField value,
|
||||||
|
CancellationToken cancellationToken = default);
|
||||||
|
Task UpdateOneAsync<TField, TField2>(Expression<Func<TEntity, bool>> predicate,
|
||||||
|
Expression<Func<TEntity, TField>> fieldExpression, TField value,
|
||||||
|
Expression<Func<TEntity, TField2>> fieldExpression2, TField2 value2,
|
||||||
|
CancellationToken cancellationToken = default);
|
||||||
|
Task UpdateOneAsync<TField, TField2, TField3>(Expression<Func<TEntity, bool>> predicate,
|
||||||
|
Expression<Func<TEntity, TField>> fieldExpression, TField value,
|
||||||
|
Expression<Func<TEntity, TField2>> fieldExpression2, TField2 value2,
|
||||||
|
Expression<Func<TEntity, TField3>> fieldExpression3, TField3 value3,
|
||||||
|
CancellationToken cancellationToken = default);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,35 @@ namespace PoweredSoft.ObjectStorage.MongoDB.Tests
|
|||||||
{
|
{
|
||||||
public class CrudTests
|
public class CrudTests
|
||||||
{
|
{
|
||||||
|
[Fact]
|
||||||
|
public async Task UpdateMany()
|
||||||
|
{
|
||||||
|
var osc = MongoDatabaseFactory.GetObjectStorageContext();
|
||||||
|
var collection = osc.GetCollection<Contact>();
|
||||||
|
var a = await collection.AddAsync(new Contact
|
||||||
|
{
|
||||||
|
LastName = "A",
|
||||||
|
FirstName = "A"
|
||||||
|
});
|
||||||
|
|
||||||
|
var b = await collection.AddAsync(new Contact
|
||||||
|
{
|
||||||
|
LastName = "B",
|
||||||
|
FirstName = "B"
|
||||||
|
});
|
||||||
|
|
||||||
|
await collection.UpdateManyAsync(t => t.LastName == "A" || t.LastName == "B", t => t.LastName, "C");
|
||||||
|
var howManyCs = await collection.GetAllAsync(t => t.LastName == "C");
|
||||||
|
var howManyCs2 = await collection.LongCountAsync(t => t.LastName == "C");
|
||||||
|
Assert.Equal(2, howManyCs.Count);
|
||||||
|
Assert.Equal(2, howManyCs2);
|
||||||
|
|
||||||
|
|
||||||
|
// clean up.
|
||||||
|
await collection.DeleteAsync(a);
|
||||||
|
await collection.DeleteAsync(b);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task CreateUpdateThenDelete()
|
public async Task CreateUpdateThenDelete()
|
||||||
{
|
{
|
||||||
@ -26,6 +55,12 @@ namespace PoweredSoft.ObjectStorage.MongoDB.Tests
|
|||||||
var updatedContact = await collection.UpdateAsync(contact);
|
var updatedContact = await collection.UpdateAsync(contact);
|
||||||
Assert.Equal("Norris", updatedContact.LastName);
|
Assert.Equal("Norris", updatedContact.LastName);
|
||||||
|
|
||||||
|
// update name back to not norris
|
||||||
|
await collection.UpdateOneAsync(t => t.Id == contact.Id, t => t.LastName, "Not Norris");
|
||||||
|
|
||||||
|
var updatedContact2 = await collection.FirstAsync(t => t.Id == contact.Id);
|
||||||
|
Assert.Equal("Not Norris", updatedContact2.LastName);
|
||||||
|
|
||||||
// delete the test.
|
// delete the test.
|
||||||
await collection.DeleteAsync(updatedContact);
|
await collection.DeleteAsync(updatedContact);
|
||||||
|
|
||||||
@ -49,6 +84,13 @@ namespace PoweredSoft.ObjectStorage.MongoDB.Tests
|
|||||||
var fetchedUsingGetAsync = await collection.GetAsync(contact.Id);
|
var fetchedUsingGetAsync = await collection.GetAsync(contact.Id);
|
||||||
Assert.NotNull(fetchedUsingGetAsync);
|
Assert.NotNull(fetchedUsingGetAsync);
|
||||||
|
|
||||||
|
Assert.True(await collection.AnyAsync(t => t.Id == contact.Id), "Any async does not work");
|
||||||
|
Assert.NotNull(await collection.FirstOrDefaultAsync(t => t.Id == contact.Id));
|
||||||
|
|
||||||
|
// does not crash.
|
||||||
|
await collection.FirstAsync(t => t.Id == contact.Id);
|
||||||
|
|
||||||
|
|
||||||
// now delete it.
|
// now delete it.
|
||||||
await collection.DeleteAsync(fetchedUsingGetAsync);
|
await collection.DeleteAsync(fetchedUsingGetAsync);
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ using System.Threading;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using MongoDB.Bson.Serialization.Attributes;
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
using MongoDB.Driver;
|
using MongoDB.Driver;
|
||||||
|
using MongoDB.Driver.Linq;
|
||||||
using PoweredSoft.DynamicLinq.Helpers;
|
using PoweredSoft.DynamicLinq.Helpers;
|
||||||
using PoweredSoft.ObjectStorage.Core;
|
using PoweredSoft.ObjectStorage.Core;
|
||||||
|
|
||||||
@ -32,6 +33,11 @@ namespace PoweredSoft.ObjectStorage.MongoDB
|
|||||||
return entity;
|
return entity;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task<bool> AnyAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default(CancellationToken))
|
||||||
|
{
|
||||||
|
return MongoQueryable.AnyAsync(Collection.AsQueryable(), predicate, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
public IQueryable<TEntity> AsQueryable()
|
public IQueryable<TEntity> AsQueryable()
|
||||||
{
|
{
|
||||||
return Collection.AsQueryable();
|
return Collection.AsQueryable();
|
||||||
@ -96,5 +102,130 @@ namespace PoweredSoft.ObjectStorage.MongoDB
|
|||||||
GetBsonIdProperty()
|
GetBsonIdProperty()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Task<TEntity> FirstOrDefaultAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return this.Collection.AsQueryable().FirstOrDefaultAsync(predicate, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<TEntity> FirstAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return this.Collection.AsQueryable().FirstAsync(predicate, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateManyAsync<TField>(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TField>> fieldExpression, TField value, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var updateDefinition = Builders<TEntity>.Update.Set<TField>(fieldExpression, value);
|
||||||
|
await Collection.UpdateManyAsync(predicate, updateDefinition, new UpdateOptions()
|
||||||
|
{
|
||||||
|
IsUpsert = false
|
||||||
|
}, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateManyAsync<TField, TField2>(Expression<Func<TEntity, bool>> predicate,
|
||||||
|
Expression<Func<TEntity, TField>> fieldExpression, TField value,
|
||||||
|
Expression<Func<TEntity, TField2>> fieldExpression2, TField2 value2,
|
||||||
|
|
||||||
|
CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var updateDefinition = Builders<TEntity>.Update
|
||||||
|
.Set(fieldExpression, value)
|
||||||
|
.Set(fieldExpression2, value2)
|
||||||
|
;
|
||||||
|
|
||||||
|
await Collection.UpdateManyAsync(predicate, updateDefinition, new UpdateOptions()
|
||||||
|
{
|
||||||
|
IsUpsert = false
|
||||||
|
}, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateManyAsync<TField, TField2, TField3>(Expression<Func<TEntity, bool>> predicate,
|
||||||
|
Expression<Func<TEntity, TField>> fieldExpression, TField value,
|
||||||
|
Expression<Func<TEntity, TField2>> fieldExpression2, TField2 value2,
|
||||||
|
Expression<Func<TEntity, TField3>> fieldExpression3, TField3 value3,
|
||||||
|
CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var updateDefinition = Builders<TEntity>.Update
|
||||||
|
.Set(fieldExpression, value)
|
||||||
|
.Set(fieldExpression2, value2)
|
||||||
|
.Set(fieldExpression3, value3)
|
||||||
|
;
|
||||||
|
|
||||||
|
await Collection.UpdateManyAsync(predicate, updateDefinition, new UpdateOptions()
|
||||||
|
{
|
||||||
|
IsUpsert = false
|
||||||
|
}, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateOneAsync<TField>(Expression<Func<TEntity, bool>> predicate, Expression<Func<TEntity, TField>> fieldExpression, TField value, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var updateDefinition = Builders<TEntity>.Update.Set<TField>(fieldExpression, value);
|
||||||
|
await Collection.UpdateOneAsync(predicate, updateDefinition, new UpdateOptions()
|
||||||
|
{
|
||||||
|
IsUpsert = false
|
||||||
|
}, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateOneAsync<TField, TField2>(Expression<Func<TEntity, bool>> predicate,
|
||||||
|
Expression<Func<TEntity, TField>> fieldExpression, TField value,
|
||||||
|
Expression<Func<TEntity, TField2>> fieldExpression2, TField2 value2,
|
||||||
|
CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var updateDefinition = Builders<TEntity>.Update
|
||||||
|
.Set(fieldExpression, value)
|
||||||
|
.Set(fieldExpression2, value2);
|
||||||
|
|
||||||
|
await Collection.UpdateOneAsync(predicate, updateDefinition, new UpdateOptions()
|
||||||
|
{
|
||||||
|
IsUpsert = false
|
||||||
|
}, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateOneAsync<TField, TField2, TField3>(Expression<Func<TEntity, bool>> predicate,
|
||||||
|
Expression<Func<TEntity, TField>> fieldExpression, TField value,
|
||||||
|
Expression<Func<TEntity, TField2>> fieldExpression2, TField2 value2,
|
||||||
|
Expression<Func<TEntity, TField3>> fieldExpression3, TField3 value3,
|
||||||
|
CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var updateDefinition = Builders<TEntity>.Update
|
||||||
|
.Set(fieldExpression, value)
|
||||||
|
.Set(fieldExpression2, value2)
|
||||||
|
.Set(fieldExpression3, value3)
|
||||||
|
;
|
||||||
|
|
||||||
|
await Collection.UpdateOneAsync(predicate, updateDefinition, new UpdateOptions()
|
||||||
|
{
|
||||||
|
IsUpsert = false
|
||||||
|
}, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateOneAsync(Expression<Func<TEntity, bool>> predicate, UpdateDefinition<TEntity> updateDefinition, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
await Collection.UpdateOneAsync(predicate, updateDefinition, new UpdateOptions()
|
||||||
|
{
|
||||||
|
IsUpsert = false
|
||||||
|
}, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateManyAsync(Expression<Func<TEntity, bool>> predicate, UpdateDefinition<TEntity> updateDefinition, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
await Collection.UpdateManyAsync(predicate, updateDefinition, new UpdateOptions()
|
||||||
|
{
|
||||||
|
IsUpsert = false
|
||||||
|
}, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<int> CountAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var longResult = await Collection.CountDocumentsAsync(predicate, null, cancellationToken);
|
||||||
|
if (longResult > int.MaxValue)
|
||||||
|
throw new Exception("Exceeds integer maximum value");
|
||||||
|
return (int)longResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<long> LongCountAsync(Expression<Func<TEntity, bool>> predicate, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return Collection.CountDocumentsAsync(predicate, null, cancellationToken);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user