Compare commits
30 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 0cf24b1dcf | |||
| fd8f98e375 | |||
| fa6687c084 | |||
| 0b939592ba | |||
| ad18170804 | |||
| 099e16a88c | |||
| e41a73f745 | |||
| 526adf0a23 | |||
| db4061dc3c | |||
| 72ea6e7999 | |||
| 7f126a098d | |||
| 456af09a84 | |||
| f0af32adca | |||
| 345fca2e6e | |||
| 57d332ef2a | |||
| 2f6515a809 | |||
| 82dc2f2024 | |||
| bc992e8c61 | |||
| 47e85f1760 | |||
| 6f5eb71dad | |||
| ed0d206a97 | |||
| 40ff874cf6 | |||
| 9fc74fc28e | |||
| 5270271008 | |||
| bf2119432e | |||
| e581586161 | |||
| 1a83abd25f | |||
| 03b0e4265b | |||
| c117bf2a7f | |||
| c50e4d086e |
@@ -0,0 +1,22 @@
|
|||||||
|
using CoreIntegrationTests.Infrastructure;
|
||||||
|
using MongoDB.Bson;
|
||||||
|
using System;
|
||||||
|
namespace CoreIntegrationTests
|
||||||
|
{
|
||||||
|
public class CoreObjectIdTestDocument : TestDoc<ObjectId>
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CRUDObjectIdTests : MongoDbTKeyDocumentTestBase<CoreObjectIdTestDocument, ObjectId>
|
||||||
|
{
|
||||||
|
public CRUDObjectIdTests(MongoDbTestFixture<CoreObjectIdTestDocument, ObjectId> fixture) : base(fixture)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CRUDObjectIdTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using CoreIntegrationTests.Infrastructure;
|
||||||
|
using MongoDbGenericRepository.Attributes;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace CoreIntegrationTests
|
||||||
|
{
|
||||||
|
[CollectionName("CoreTestingCNameAttrPart")]
|
||||||
|
public class CorePartitionedCollectionNameDoc : TestDoc, IPartitionedDocument
|
||||||
|
{
|
||||||
|
public CorePartitionedCollectionNameDoc()
|
||||||
|
{
|
||||||
|
PartitionKey = "CoreTestPartitionKeyCollectionName";
|
||||||
|
}
|
||||||
|
|
||||||
|
public string PartitionKey { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CRUDPartitionedCollectionNameAttributeTests : MongoDbDocumentTestBase<CorePartitionedCollectionNameDoc>
|
||||||
|
{
|
||||||
|
public CRUDPartitionedCollectionNameAttributeTests(MongoDbTestFixture<CorePartitionedCollectionNameDoc, Guid> fixture) : base(fixture)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CoreCRUDPartitionedCollectionNameAttributeTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
using CoreIntegrationTests.Infrastructure;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace CoreIntegrationTests
|
||||||
|
{
|
||||||
|
public class CorePartitionedDoc : TestDoc, IPartitionedDocument
|
||||||
|
{
|
||||||
|
public CorePartitionedDoc()
|
||||||
|
{
|
||||||
|
PartitionKey = "CoreTestPartitionKey";
|
||||||
|
}
|
||||||
|
|
||||||
|
public string PartitionKey { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CRUDPartitionedTests : MongoDbDocumentTestBase<CorePartitionedDoc>
|
||||||
|
{
|
||||||
|
public CRUDPartitionedTests(MongoDbTestFixture<CorePartitionedDoc, Guid> fixture) : base(fixture)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CoreCRUDPartitionedTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
using CoreIntegrationTests.Infrastructure;
|
||||||
|
using MongoDbGenericRepository.Attributes;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace CoreIntegrationTests
|
||||||
|
{
|
||||||
|
[CollectionName("TestingCNameAttrPartTKey")]
|
||||||
|
public class CoreTKeyPartitionedCollectionNameDoc : TestDoc<Guid>, IPartitionedDocument
|
||||||
|
{
|
||||||
|
public CoreTKeyPartitionedCollectionNameDoc()
|
||||||
|
{
|
||||||
|
PartitionKey = "CoreTestPartitionKey";
|
||||||
|
}
|
||||||
|
|
||||||
|
public string PartitionKey { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CRUDTKeyPartitionedCollectionNameAttributeTests : MongoDbTKeyDocumentTestBase<CoreTKeyPartitionedCollectionNameDoc, Guid>
|
||||||
|
{
|
||||||
|
public CRUDTKeyPartitionedCollectionNameAttributeTests(MongoDbTestFixture<CoreTKeyPartitionedCollectionNameDoc, Guid> fixture) : base(fixture)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CoreCRUDTKeyPartitionedCollectionNameAttributeTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
using CoreIntegrationTests.Infrastructure;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace CoreIntegrationTests
|
||||||
|
{
|
||||||
|
public class CorePartitionedTKeyTestDocument : TestDoc<Guid>, IPartitionedDocument
|
||||||
|
{
|
||||||
|
public CorePartitionedTKeyTestDocument()
|
||||||
|
{
|
||||||
|
PartitionKey = "CoreTestPartitionKey";
|
||||||
|
}
|
||||||
|
public string PartitionKey { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CRUDTKeyPartitionedTests : MongoDbTKeyDocumentTestBase<CorePartitionedTKeyTestDocument, Guid>
|
||||||
|
{
|
||||||
|
public CRUDTKeyPartitionedTests(MongoDbTestFixture<CorePartitionedTKeyTestDocument, Guid> fixture) : base(fixture)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CoreCRUDTKeyPartitionedTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using CoreIntegrationTests.Infrastructure;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace CoreIntegrationTests
|
||||||
|
{
|
||||||
|
public class CoreTKeyTestDocument : TestDoc<Guid>
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CRUDTKeyTests : MongoDbTKeyDocumentTestBase<CoreTKeyTestDocument, Guid>
|
||||||
|
{
|
||||||
|
public CRUDTKeyTests(MongoDbTestFixture<CoreTKeyTestDocument, Guid> fixture) : base(fixture)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CreateTKeyTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using CoreIntegrationTests.Infrastructure;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace CoreIntegrationTests
|
||||||
|
{
|
||||||
|
public class CoreTestDocument : TestDoc
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CRUDTests : MongoDbDocumentTestBase<CoreTestDocument>
|
||||||
|
{
|
||||||
|
public CRUDTests(MongoDbTestFixture<CoreTestDocument, Guid> fixture) : base(fixture)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CRUDTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,17 +5,23 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.0.1" />
|
<PackageReference Include="Microsoft.AspNetCore.Identity" Version="2.1.2" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="2.0.1" />
|
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="2.1.2" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.5.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
|
||||||
<PackageReference Include="MongoDB.Driver" Version="2.5.0" />
|
<PackageReference Include="MongoDB.Driver" Version="2.7.0" />
|
||||||
<PackageReference Include="MongoDbGenericRepository" Version="1.3.4" />
|
<PackageReference Include="MongoDbGenericRepository" Version="1.3.8" />
|
||||||
<PackageReference Include="xunit" Version="2.3.1" />
|
<PackageReference Include="xunit" Version="2.4.0" />
|
||||||
<PackageReference Include="xunit.runner.console" Version="2.3.1" />
|
<PackageReference Include="xunit.runner.console" Version="2.4.0" />
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.3.1" />
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.0" />
|
||||||
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.0-beta4-build3742" />
|
<DotNetCliToolReference Include="dotnet-xunit" Version="2.3.0-beta4-build3742" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System.Configuration">
|
||||||
|
<HintPath>..\..\..\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Configuration.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Update="App.config">
|
<None Update="App.config">
|
||||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||||
|
|||||||
@@ -1,67 +0,0 @@
|
|||||||
using CoreIntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using Xunit;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace CoreIntegrationTests
|
|
||||||
{
|
|
||||||
public class CreateTestsPartitionedDocument : PartitionedDocument
|
|
||||||
{
|
|
||||||
public CreateTestsPartitionedDocument() : base("TestPartitionKey")
|
|
||||||
{
|
|
||||||
Version = 1;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class CreatePartitionedTests : BaseMongoDbRepositoryTests<CreateTestsPartitionedDocument>
|
|
||||||
{
|
|
||||||
private void PartitionedAddOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = new CreateTestsPartitionedDocument();
|
|
||||||
// Act
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey);
|
|
||||||
Xunit.Assert.Equal(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedAddOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = new CreateTestsPartitionedDocument();
|
|
||||||
// Act
|
|
||||||
await SUT.AddOneAsync(document);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey);
|
|
||||||
Assert.Equal(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedAddMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = new List<CreateTestsPartitionedDocument> { new CreateTestsPartitionedDocument(), new CreateTestsPartitionedDocument() };
|
|
||||||
// Act
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsPartitionedDocument>(e => e.Id == documents[0].Id || e.Id == documents[1].Id, PartitionKey);
|
|
||||||
Assert.Equal(2, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedAddManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = new List<CreateTestsPartitionedDocument> { new CreateTestsPartitionedDocument(), new CreateTestsPartitionedDocument() };
|
|
||||||
// Act
|
|
||||||
await SUT.AddManyAsync(documents);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsPartitionedDocument>(e => e.Id == documents[0].Id || e.Id == documents[1].Id, PartitionKey);
|
|
||||||
Assert.Equal(2, count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
using CoreIntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using Xunit;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace CoreIntegrationTests
|
|
||||||
{
|
|
||||||
public class CreateTestsDocument : Document
|
|
||||||
{
|
|
||||||
public CreateTestsDocument()
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class CreateTests : BaseMongoDbRepositoryTests<CreateTestsDocument>
|
|
||||||
{
|
|
||||||
[Fact]
|
|
||||||
public void AddOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = new CreateTestsDocument();
|
|
||||||
// Act
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsDocument>(e => e.Id == document.Id);
|
|
||||||
Assert.Equal(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task AddOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = new CreateTestsDocument();
|
|
||||||
// Act
|
|
||||||
await SUT.AddOneAsync(document);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsDocument>(e => e.Id == document.Id);
|
|
||||||
Assert.Equal(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void AddMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = new List<CreateTestsDocument> { new CreateTestsDocument(), new CreateTestsDocument() };
|
|
||||||
// Act
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsDocument>(e => e.Id == documents[0].Id || e.Id == documents[1].Id);
|
|
||||||
Assert.Equal(2, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task AddManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = new List<CreateTestsDocument> { new CreateTestsDocument(), new CreateTestsDocument() };
|
|
||||||
// Act
|
|
||||||
await SUT.AddManyAsync(documents);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsDocument>(e => e.Id == documents[0].Id || e.Id == documents[1].Id);
|
|
||||||
Assert.Equal(2, count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
using CoreIntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using Xunit;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace CoreIntegrationTests
|
|
||||||
{
|
|
||||||
public class DeleteTestsPartitionedDocument : PartitionedDocument
|
|
||||||
{
|
|
||||||
public DeleteTestsPartitionedDocument() : base("TestPartitionKey")
|
|
||||||
{
|
|
||||||
Version = 1;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DeletePartitionedTests : BaseMongoDbRepositoryTests<DeleteTestsPartitionedDocument>
|
|
||||||
{
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedDeleteOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteOne(document);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedDeleteOneLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteOne<DeleteTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedDeleteOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteOneAsync(document);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedDeleteOneAsyncLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteOneAsync<DeleteTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedDeleteManyAsyncLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "DeleteManyAsyncLinqContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteManyAsync<DeleteTestsPartitionedDocument>(e => e.SomeContent == "DeleteManyAsyncLinqContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsPartitionedDocument>(e => e.SomeContent == "DeleteManyAsyncLinqContent", PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedDeleteManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "DeleteManyAsyncLinqContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteManyAsync(documents);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsPartitionedDocument>(e => e.SomeContent == "DeleteManyAsyncLinqContent", PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedDeleteManyLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var content = "DeleteManyLinqContent";
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = content);
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteMany<DeleteTestsPartitionedDocument>(e => e.SomeContent == content, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsPartitionedDocument>(e => e.SomeContent == content, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedDeleteMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var content = "DeleteManyContent";
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = content);
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteMany(documents);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsPartitionedDocument>(e => e.SomeContent == content, PartitionKey));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
using CoreIntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using Xunit;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace CoreIntegrationTests
|
|
||||||
{
|
|
||||||
public class DeleteTestsDocument : Document
|
|
||||||
{
|
|
||||||
public DeleteTestsDocument()
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DeleteTests : BaseMongoDbRepositoryTests<DeleteTestsDocument>
|
|
||||||
{
|
|
||||||
[Fact]
|
|
||||||
public void DeleteOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteOne(document);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsDocument>(e => e.Id == document.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void DeleteOneLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteOne<DeleteTestsDocument>(e => e.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsDocument>(e => e.Id == document.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task DeleteOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteOneAsync(document);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsDocument>(e => e.Id == document.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task DeleteOneAsyncLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteOneAsync<DeleteTestsDocument>(e => e.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsDocument>(e => e.Id == document.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task DeleteManyAsyncLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "DeleteManyAsyncLinqContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteManyAsync<DeleteTestsDocument>(e => e.SomeContent == "DeleteManyAsyncLinqContent");
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsDocument>(e => e.SomeContent == "DeleteManyAsyncLinqContent"));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task DeleteManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "DeleteManyAsyncLinqContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteManyAsync(documents);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsDocument>(e => e.SomeContent == "DeleteManyAsyncLinqContent"));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void DeleteManyLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var content = "DeleteManyLinqContent";
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = content);
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteMany<DeleteTestsDocument>(e => e.SomeContent == content);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsDocument>(e => e.SomeContent == content));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void DeleteMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var content = "DeleteManyContent";
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = content);
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteMany(documents);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result);
|
|
||||||
Assert.False(SUT.Any<DeleteTestsDocument>(e => e.SomeContent == content));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -6,7 +6,7 @@ using Xunit;
|
|||||||
using Microsoft.AspNetCore.Identity;
|
using Microsoft.AspNetCore.Identity;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace CoreCoreIntegrationTests
|
namespace CoreIntegrationTests
|
||||||
{
|
{
|
||||||
public class MongoIdentityUser<TKey> : IdentityUser<TKey>, IDocument<TKey>
|
public class MongoIdentityUser<TKey> : IdentityUser<TKey>, IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace CoreIntegrationTests.Infrastructure
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A class holding global variables.
|
||||||
|
/// </summary>
|
||||||
|
public static class GlobalVariables
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A random number generator.
|
||||||
|
/// </summary>
|
||||||
|
public static Random Random = new Random();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,4 @@
|
|||||||
using CoreCoreIntegrationTests;
|
using MongoDB.Bson.Serialization.Conventions;
|
||||||
using MongoDB.Bson.Serialization;
|
|
||||||
using MongoDB.Bson.Serialization.Conventions;
|
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
|
|
||||||
namespace CoreIntegrationTests.Infrastructure
|
namespace CoreIntegrationTests.Infrastructure
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,55 @@
|
|||||||
|
using MongoDbGenericRepository;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
|
||||||
|
namespace CoreIntegrationTests.Infrastructure
|
||||||
|
{
|
||||||
|
|
||||||
|
public class MongoDbTestFixture<T, TKey> : IDisposable
|
||||||
|
where T : IDocument<TKey>, new()
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
|
||||||
|
public IMongoDbContext Context;
|
||||||
|
|
||||||
|
public MongoDbTestFixture()
|
||||||
|
{
|
||||||
|
DocsToDelete = new ConcurrentBag<T>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public string PartitionKey { get; set; }
|
||||||
|
|
||||||
|
public ConcurrentBag<T> DocsToDelete { get; set; }
|
||||||
|
|
||||||
|
public virtual void Dispose()
|
||||||
|
{
|
||||||
|
var docIds = DocsToDelete.ToList().Select(e => e.Id);
|
||||||
|
if (docIds.Any())
|
||||||
|
{
|
||||||
|
TestRepository.Instance.DeleteMany<T, TKey>(e => docIds.Contains(e.Id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public T CreateTestDocument()
|
||||||
|
{
|
||||||
|
var doc = new T();
|
||||||
|
DocsToDelete.Add(doc);
|
||||||
|
return doc;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<T> CreateTestDocuments(int numberOfDocumentsToCreate)
|
||||||
|
{
|
||||||
|
var docs = new List<T>();
|
||||||
|
for (var i = 0; i < numberOfDocumentsToCreate; i++)
|
||||||
|
{
|
||||||
|
docs.Add(new T());
|
||||||
|
DocsToDelete.Add(docs.Last());
|
||||||
|
}
|
||||||
|
return docs;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace CoreIntegrationTests.Infrastructure
|
||||||
|
{
|
||||||
|
// Thanks BlueRaja - Danny Pflughoeft https://stackoverflow.com/a/13095144/5103354
|
||||||
|
/// <summary>
|
||||||
|
/// Extensions for the random number generator <see cref="Random"/>
|
||||||
|
/// </summary>
|
||||||
|
public static class RandomExtensions
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a random long from min (inclusive) to max (exclusive)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="random">The given random instance</param>
|
||||||
|
/// <param name="min">The inclusive minimum bound</param>
|
||||||
|
/// <param name="max">The exclusive maximum bound. Must be greater than min</param>
|
||||||
|
public static long NextLong(this Random random, long min, long max)
|
||||||
|
{
|
||||||
|
if (max <= min)
|
||||||
|
throw new ArgumentOutOfRangeException("max", "max must be > min!");
|
||||||
|
|
||||||
|
//Working with ulong so that modulo works correctly with values > long.MaxValue
|
||||||
|
ulong uRange = (ulong)(max - min);
|
||||||
|
|
||||||
|
//Prevent a modulo bias; see https://stackoverflow.com/a/10984975/238419
|
||||||
|
//for more information.
|
||||||
|
//In the worst case, the expected number of calls is 2 (though usually it's
|
||||||
|
//much closer to 1) so this loop doesn't really hurt performance at all.
|
||||||
|
ulong ulongRand;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
byte[] buf = new byte[8];
|
||||||
|
random.NextBytes(buf);
|
||||||
|
ulongRand = (ulong)BitConverter.ToInt64(buf, 0);
|
||||||
|
} while (ulongRand > ulong.MaxValue - ((ulong.MaxValue % uRange) + 1) % uRange);
|
||||||
|
|
||||||
|
return (long)(ulongRand % uRange) + min;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a random long from 0 (inclusive) to max (exclusive)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="random">The given random instance</param>
|
||||||
|
/// <param name="max">The exclusive maximum bound. Must be greater than 0</param>
|
||||||
|
public static long NextLong(this Random random, long max)
|
||||||
|
{
|
||||||
|
return random.NextLong(0, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a random long over all possible values of long (except long.MaxValue, similar to
|
||||||
|
/// random.Next())
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="random">The given random instance</param>
|
||||||
|
public static long NextLong(this Random random)
|
||||||
|
{
|
||||||
|
return random.NextLong(long.MinValue, long.MaxValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using MongoDbGenericRepository.Utils;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace CoreIntegrationTests.Infrastructure
|
||||||
|
{
|
||||||
|
public class ProjectedGroup
|
||||||
|
{
|
||||||
|
public int Key { get; set; }
|
||||||
|
public List<string> Content { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MyTestProjection
|
||||||
|
{
|
||||||
|
public string SomeContent { get; set; }
|
||||||
|
public DateTime SomeDate { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Nested
|
||||||
|
{
|
||||||
|
public DateTime SomeDate { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Child
|
||||||
|
{
|
||||||
|
public Child(string type, string value)
|
||||||
|
{
|
||||||
|
Type = type;
|
||||||
|
Value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Type { get; set; }
|
||||||
|
public string Value { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TestDoc : Document
|
||||||
|
{
|
||||||
|
public TestDoc()
|
||||||
|
{
|
||||||
|
Version = 2;
|
||||||
|
Nested = new Nested
|
||||||
|
{
|
||||||
|
SomeDate = DateTime.UtcNow
|
||||||
|
};
|
||||||
|
Children = new List<Child>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int SomeValue { get; set; }
|
||||||
|
|
||||||
|
public string SomeContent { get; set; }
|
||||||
|
public string SomeContent2 { get; set; }
|
||||||
|
public string SomeContent3 { get; set; }
|
||||||
|
|
||||||
|
public int GroupingKey { get; set; }
|
||||||
|
|
||||||
|
public Nested Nested { get; set; }
|
||||||
|
|
||||||
|
public List<Child> Children { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TestDoc<TKey> : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
[BsonId]
|
||||||
|
public TKey Id { get; set; }
|
||||||
|
public int Version { get; set; }
|
||||||
|
|
||||||
|
public TestDoc()
|
||||||
|
{
|
||||||
|
InitializeFields();
|
||||||
|
Version = 2;
|
||||||
|
Nested = new Nested
|
||||||
|
{
|
||||||
|
SomeDate = DateTime.UtcNow
|
||||||
|
};
|
||||||
|
Children = new List<Child>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SomeContent { get; set; }
|
||||||
|
public string SomeContent4 { get; set; }
|
||||||
|
public string SomeContent5 { get; set; }
|
||||||
|
|
||||||
|
public Nested Nested { get; set; }
|
||||||
|
|
||||||
|
public List<Child> Children { get; set; }
|
||||||
|
|
||||||
|
public TId Init<TId>()
|
||||||
|
{
|
||||||
|
return IdGenerator.GetId<TId>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitializeFields()
|
||||||
|
{
|
||||||
|
Id = Init<TKey>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
using CoreIntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using Xunit;
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace CoreIntegrationTests
|
|
||||||
{
|
|
||||||
public class ProjectTestsPartitionedDocument : PartitionedDocument
|
|
||||||
{
|
|
||||||
public ProjectTestsPartitionedDocument() : base("TestPartitionKey")
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
Nested = new Nested
|
|
||||||
{
|
|
||||||
SomeDate = DateTime.UtcNow
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
|
|
||||||
public Nested Nested { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProjectPartitionedTests : BaseMongoDbRepositoryTests<ProjectTestsPartitionedDocument>
|
|
||||||
{
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedProjectOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectOneAsyncContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
document.SomeContent = someContent;
|
|
||||||
document.Nested.SomeDate = someDate;
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.ProjectOneAsync<ProjectTestsPartitionedDocument, MyProjection>(
|
|
||||||
x => x.Id == document.Id,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
},
|
|
||||||
PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(result);
|
|
||||||
Assert.Equal(someContent, result.SomeContent);
|
|
||||||
Assert.Equal(someDate.Minute, result.SomeDate.Minute);
|
|
||||||
Assert.Equal(someDate.Second, result.SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedProjectOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectOneContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
document.SomeContent = someContent;
|
|
||||||
document.Nested.SomeDate = someDate;
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.ProjectOne<ProjectTestsPartitionedDocument, MyProjection>(
|
|
||||||
x => x.Id == document.Id,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
},
|
|
||||||
PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(result);
|
|
||||||
Assert.Equal(someContent, result.SomeContent);
|
|
||||||
Assert.Equal(someDate.Minute, result.SomeDate.Minute);
|
|
||||||
Assert.Equal(someDate.Second, result.SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedProjectManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectManyAsyncContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocuments(5);
|
|
||||||
document.ForEach(e =>
|
|
||||||
{
|
|
||||||
e.SomeContent = someContent;
|
|
||||||
e.Nested.SomeDate = someDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
SUT.AddMany(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.ProjectManyAsync<ProjectTestsPartitionedDocument, MyProjection>(
|
|
||||||
x => x.SomeContent == someContent,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
},
|
|
||||||
PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result.Count);
|
|
||||||
Assert.Equal(someContent, result.First().SomeContent);
|
|
||||||
Assert.Equal(someDate.Minute, result.First().SomeDate.Minute);
|
|
||||||
Assert.Equal(someDate.Second, result.First().SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedProjectMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectManyContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocuments(5);
|
|
||||||
document.ForEach(e =>
|
|
||||||
{
|
|
||||||
e.SomeContent = someContent;
|
|
||||||
e.Nested.SomeDate = someDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
SUT.AddMany(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.ProjectMany<ProjectTestsPartitionedDocument, MyProjection>(
|
|
||||||
x => x.SomeContent == someContent,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
},
|
|
||||||
PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result.Count);
|
|
||||||
Assert.Equal(someContent, result.First().SomeContent);
|
|
||||||
Assert.Equal(someDate.Minute, result.First().SomeDate.Minute);
|
|
||||||
Assert.Equal(someDate.Second, result.First().SomeDate.Second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
using CoreIntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using Xunit;
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace CoreIntegrationTests
|
|
||||||
{
|
|
||||||
public class Nested
|
|
||||||
{
|
|
||||||
public DateTime SomeDate { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MyProjection
|
|
||||||
{
|
|
||||||
public DateTime SomeDate { get; set; }
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProjectTestsDocument : Document
|
|
||||||
{
|
|
||||||
public ProjectTestsDocument()
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
Nested = new Nested
|
|
||||||
{
|
|
||||||
SomeDate = DateTime.UtcNow
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
|
|
||||||
public Nested Nested { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProjectTests : BaseMongoDbRepositoryTests<ProjectTestsDocument>
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task ProjectOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectOneAsyncContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
document.SomeContent = someContent;
|
|
||||||
document.Nested.SomeDate = someDate;
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.ProjectOneAsync<ProjectTestsDocument, MyProjection>(
|
|
||||||
x => x.Id == document.Id,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
});
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(result);
|
|
||||||
Assert.Equal(someContent, result.SomeContent);
|
|
||||||
Assert.Equal(someDate.Minute, result.SomeDate.Minute);
|
|
||||||
Assert.Equal(someDate.Second, result.SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void ProjectOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectOneContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
document.SomeContent = someContent;
|
|
||||||
document.Nested.SomeDate = someDate;
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.ProjectOne<ProjectTestsDocument, MyProjection>(
|
|
||||||
x => x.Id == document.Id,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
});
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(result);
|
|
||||||
Assert.Equal(someContent, result.SomeContent);
|
|
||||||
Assert.Equal(someDate.Minute, result.SomeDate.Minute);
|
|
||||||
Assert.Equal(someDate.Second, result.SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task ProjectManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectManyAsyncContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocuments(5);
|
|
||||||
document.ForEach(e =>
|
|
||||||
{
|
|
||||||
e.SomeContent = someContent;
|
|
||||||
e.Nested.SomeDate = someDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
SUT.AddMany(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.ProjectManyAsync<ProjectTestsDocument, MyProjection>(
|
|
||||||
x => x.SomeContent == someContent,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
});
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result.Count);
|
|
||||||
Assert.Equal(someContent, result.First().SomeContent);
|
|
||||||
Assert.Equal(someDate.Minute, result.First().SomeDate.Minute);
|
|
||||||
Assert.Equal(someDate.Second, result.First().SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void ProjectMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectManyContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocuments(5);
|
|
||||||
document.ForEach(e =>
|
|
||||||
{
|
|
||||||
e.SomeContent = someContent;
|
|
||||||
e.Nested.SomeDate = someDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
SUT.AddMany(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.ProjectMany<ProjectTestsDocument, MyProjection>(
|
|
||||||
x => x.SomeContent == someContent,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
});
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result.Count);
|
|
||||||
Assert.Equal(someContent, result.First().SomeContent);
|
|
||||||
Assert.Equal(someDate.Minute, result.First().SomeDate.Minute);
|
|
||||||
Assert.Equal(someDate.Second, result.First().SomeDate.Second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,181 +0,0 @@
|
|||||||
using CoreIntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using Xunit;
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace CoreIntegrationTests
|
|
||||||
{
|
|
||||||
public class ReadTestsPartitionedDocument : PartitionedDocument
|
|
||||||
{
|
|
||||||
public ReadTestsPartitionedDocument() : base("TestPartitionKey")
|
|
||||||
{
|
|
||||||
Version = 1;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ReadPartitionedTests : BaseMongoDbRepositoryTests<ReadTestsPartitionedDocument>
|
|
||||||
{
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedGetByIdAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetByIdAsync<ReadTestsPartitionedDocument>(document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedGetById()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetById<ReadTestsPartitionedDocument>(document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedGetOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetOneAsync<ReadTestsPartitionedDocument>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedGetOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetOne<ReadTestsPartitionedDocument>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedGetCursor()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var cursor = SUT.GetCursor<ReadTestsPartitionedDocument>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
var count = cursor.Count();
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedAnyAsyncReturnsTrue()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.AnyAsync<ReadTestsPartitionedDocument>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.True(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedAnyAsyncReturnsFalse()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.AnyAsync<ReadTestsPartitionedDocument>(x => x.Id == Guid.NewGuid(), PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.False(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedAnyReturnsTrue()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Any<ReadTestsPartitionedDocument>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.True(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedAnyReturnsFalse()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Any<ReadTestsPartitionedDocument>(x => x.Id == Guid.NewGuid(), PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.False(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedGetAllAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "GetAllAsyncContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetAllAsync<ReadTestsPartitionedDocument>(x => x.SomeContent == "GetAllAsyncContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedGetAll()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "GetAllContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetAll<ReadTestsPartitionedDocument>(x => x.SomeContent == "GetAllContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedCountAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "CountAsyncContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.CountAsync<ReadTestsPartitionedDocument>(x => x.SomeContent == "CountAsyncContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedCount()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "CountContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Count<ReadTestsPartitionedDocument>(x => x.SomeContent == "CountContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,181 +0,0 @@
|
|||||||
using CoreIntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using Xunit;
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace CoreIntegrationTests
|
|
||||||
{
|
|
||||||
public class ReadTestsDocument : Document
|
|
||||||
{
|
|
||||||
public ReadTestsDocument()
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ReadTests : BaseMongoDbRepositoryTests<ReadTestsDocument>
|
|
||||||
{
|
|
||||||
[Fact]
|
|
||||||
public async Task GetByIdAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetByIdAsync<ReadTestsDocument>(document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void GetById()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetById<ReadTestsDocument>(document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task GetOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetOneAsync<ReadTestsDocument>(x => x.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void GetOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetOne<ReadTestsDocument>(x => x.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.NotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void GetCursor()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var cursor = SUT.GetCursor<ReadTestsDocument>(x => x.Id == document.Id);
|
|
||||||
var count = cursor.Count();
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task AnyAsyncReturnsTrue()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.AnyAsync<ReadTestsDocument>(x => x.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.True(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task AnyAsyncReturnsFalse()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.AnyAsync<ReadTestsDocument>(x => x.Id == Guid.NewGuid());
|
|
||||||
// Assert
|
|
||||||
Assert.False(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void AnyReturnsTrue()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Any<ReadTestsDocument>(x => x.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.True(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void AnyReturnsFalse()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Any<ReadTestsDocument>(x => x.Id == Guid.NewGuid());
|
|
||||||
// Assert
|
|
||||||
Assert.False(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task GetAllAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "GetAllAsyncContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetAllAsync<ReadTestsDocument>(x => x.SomeContent == "GetAllAsyncContent");
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void GetAll()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "GetAllContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetAll<ReadTestsDocument>(x => x.SomeContent == "GetAllContent");
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task CountAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "CountAsyncContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.CountAsync<ReadTestsDocument>(x => x.SomeContent == "CountAsyncContent");
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public void Count()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "CountContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Count<ReadTestsDocument>(x => x.SomeContent == "CountContent");
|
|
||||||
// Assert
|
|
||||||
Assert.Equal(5, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
using CoreIntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using Xunit;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace CoreIntegrationTests
|
|
||||||
{
|
|
||||||
public class UpdateTestsPartitionedDocument : PartitionedDocument
|
|
||||||
{
|
|
||||||
public UpdateTestsPartitionedDocument() : base("TestPartitionKey")
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class UpdatePartitionedTests : BaseMongoDbRepositoryTests<UpdateTestsPartitionedDocument>
|
|
||||||
{
|
|
||||||
[Fact]
|
|
||||||
public void PartitionedUpdateOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
document.SomeContent = "UpdateOneContent";
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne(document);
|
|
||||||
// Assert
|
|
||||||
Assert.True(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedDocument>(document.Id, PartitionKey);
|
|
||||||
Assert.NotNull(updatedDocument);
|
|
||||||
Assert.Equal("UpdateOneContent", updatedDocument.SomeContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task PartitionedUpdateOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
document.SomeContent = "UpdateOneAsyncContent";
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync(document);
|
|
||||||
// Assert
|
|
||||||
Assert.True(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedDocument>(document.Id, PartitionKey);
|
|
||||||
Assert.NotNull(updatedDocument);
|
|
||||||
Assert.Equal("UpdateOneAsyncContent", updatedDocument.SomeContent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
using CoreIntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using Xunit;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace CoreIntegrationTests
|
|
||||||
{
|
|
||||||
public class UpdateTestsDocument : Document
|
|
||||||
{
|
|
||||||
public UpdateTestsDocument()
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class UpdateTests : BaseMongoDbRepositoryTests<UpdateTestsDocument>
|
|
||||||
{
|
|
||||||
[Fact]
|
|
||||||
public void UpdateOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
document.SomeContent = "UpdateOneContent";
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne(document);
|
|
||||||
// Assert
|
|
||||||
Assert.True(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsDocument>(document.Id);
|
|
||||||
Assert.NotNull(updatedDocument);
|
|
||||||
Assert.Equal("UpdateOneContent", updatedDocument.SomeContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task UpdateOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
document.SomeContent = "UpdateOneAsyncContent";
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync(document);
|
|
||||||
// Assert
|
|
||||||
Assert.True(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsDocument>(document.Id);
|
|
||||||
Assert.NotNull(updatedDocument);
|
|
||||||
Assert.Equal("UpdateOneAsyncContent", updatedDocument.SomeContent);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
using IntegrationTests.Infrastructure;
|
||||||
|
using MongoDB.Bson;
|
||||||
|
using NUnit.Framework;
|
||||||
|
|
||||||
|
namespace IntegrationTests
|
||||||
|
{
|
||||||
|
public class ObjectIdTestDocument : TestDoc<ObjectId>
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestFixture]
|
||||||
|
public class CRUDObjectIdTests : MongoDbTKeyDocumentTestBase<ObjectIdTestDocument, ObjectId>
|
||||||
|
{
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CRUDObjectIdTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
using IntegrationTests.Infrastructure;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
using MongoDbGenericRepository.Attributes;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace IntegrationTests
|
||||||
|
{
|
||||||
|
[CollectionName("TestingCollectionNameAttributePartitionedTKey")]
|
||||||
|
public class PartitionedCollectionNameDoc : TestDoc, IPartitionedDocument
|
||||||
|
{
|
||||||
|
public PartitionedCollectionNameDoc()
|
||||||
|
{
|
||||||
|
PartitionKey = "TestPartitionKey";
|
||||||
|
}
|
||||||
|
|
||||||
|
public string PartitionKey { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CRUDPartitionedCollectionNameAttributeTests : MongoDbDocumentTestBase<PartitionedCollectionNameDoc>
|
||||||
|
{
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CRUDPartitionedCollectionNameAttributeTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
using IntegrationTests.Infrastructure;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
|
||||||
|
namespace IntegrationTests
|
||||||
|
{
|
||||||
|
public class PartitionedDoc : TestDoc, IPartitionedDocument
|
||||||
|
{
|
||||||
|
public PartitionedDoc()
|
||||||
|
{
|
||||||
|
PartitionKey = "TestPartitionKey";
|
||||||
|
}
|
||||||
|
|
||||||
|
public string PartitionKey { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CRUDPartitionedTests : MongoDbDocumentTestBase<PartitionedDoc>
|
||||||
|
{
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CRUDPartitionedCollectionNameAttributeTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
using IntegrationTests.Infrastructure;
|
||||||
|
using MongoDbGenericRepository.Attributes;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace IntegrationTests
|
||||||
|
{
|
||||||
|
[CollectionName("TestingCollectionNameAttributePartitionedTKey")]
|
||||||
|
public class TKeyPartitionedCollectionNameDoc : TestDoc<Guid>, IPartitionedDocument
|
||||||
|
{
|
||||||
|
public TKeyPartitionedCollectionNameDoc()
|
||||||
|
{
|
||||||
|
PartitionKey = "TestPartitionKey";
|
||||||
|
}
|
||||||
|
|
||||||
|
public string PartitionKey { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class CRUDTKeyPartitionedCollectionNameAttributeTests : MongoDbTKeyDocumentTestBase<TKeyPartitionedCollectionNameDoc, Guid>
|
||||||
|
{
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CRUDTKeyPartitionedCollectionNameAttributeTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
using IntegrationTests.Infrastructure;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace IntegrationTests
|
||||||
|
{
|
||||||
|
public class PartitionedTKeyTestDocument : TestDoc<Guid>, IPartitionedDocument
|
||||||
|
{
|
||||||
|
public PartitionedTKeyTestDocument()
|
||||||
|
{
|
||||||
|
PartitionKey = "TestPartitionKey";
|
||||||
|
}
|
||||||
|
public string PartitionKey { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestFixture]
|
||||||
|
public class CRUDTKeyPartitionedTests : MongoDbTKeyDocumentTestBase<PartitionedTKeyTestDocument, Guid>
|
||||||
|
{
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CRUDTKeyPartitionedTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
using IntegrationTests.Infrastructure;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace IntegrationTests
|
||||||
|
{
|
||||||
|
public class TKeyTestDocument : TestDoc<Guid>
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestFixture]
|
||||||
|
public class CRUDTKeyTests : MongoDbTKeyDocumentTestBase<TKeyTestDocument, Guid>
|
||||||
|
{
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CreateTKeyTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
using IntegrationTests.Infrastructure;
|
||||||
|
using NUnit.Framework;
|
||||||
|
|
||||||
|
namespace IntegrationTests
|
||||||
|
{
|
||||||
|
public class TestDocument : TestDoc
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestFixture]
|
||||||
|
public class CRUDTests : MongoDbDocumentTestBase<TestDocument>
|
||||||
|
{
|
||||||
|
public override string GetClassName()
|
||||||
|
{
|
||||||
|
return "CRUDTests";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class CreateTestsPartitionedDocument : PartitionedDocument
|
|
||||||
{
|
|
||||||
public CreateTestsPartitionedDocument() : base("TestPartitionKey")
|
|
||||||
{
|
|
||||||
Version = 1;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class CreatePartitionedTests : BaseMongoDbRepositoryTests<CreateTestsPartitionedDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void PartitionedAddOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = new CreateTestsPartitionedDocument();
|
|
||||||
// Act
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey);
|
|
||||||
Assert.AreEqual(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedAddOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = new CreateTestsPartitionedDocument();
|
|
||||||
// Act
|
|
||||||
await SUT.AddOneAsync(document);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey);
|
|
||||||
Assert.AreEqual(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedAddMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = new List<CreateTestsPartitionedDocument> { new CreateTestsPartitionedDocument(), new CreateTestsPartitionedDocument() };
|
|
||||||
// Act
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsPartitionedDocument>(e => e.Id == documents[0].Id || e.Id == documents[1].Id, PartitionKey);
|
|
||||||
Assert.AreEqual(2, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedAddManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = new List<CreateTestsPartitionedDocument> { new CreateTestsPartitionedDocument(), new CreateTestsPartitionedDocument() };
|
|
||||||
// Act
|
|
||||||
await SUT.AddManyAsync(documents);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsPartitionedDocument>(e => e.Id == documents[0].Id || e.Id == documents[1].Id, PartitionKey);
|
|
||||||
Assert.AreEqual(2, count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDB.Bson.Serialization.Attributes;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class CreateTestsPartitionedTKeyDocument : IDocument<Guid>, IPartitionedDocument
|
|
||||||
{
|
|
||||||
[BsonId]
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Version { get; set; }
|
|
||||||
public CreateTestsPartitionedTKeyDocument()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid();
|
|
||||||
Version = 2;
|
|
||||||
PartitionKey = "TestPartitionKey";
|
|
||||||
}
|
|
||||||
public string PartitionKey { get; set; }
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class CreatePartitionedTKeyTests : BaseMongoDbRepositoryTests<CreateTestsPartitionedTKeyDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void PartitionedAddOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = new CreateTestsPartitionedTKeyDocument();
|
|
||||||
// Act
|
|
||||||
SUT.AddOne<CreateTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsPartitionedTKeyDocument, Guid>(e => e.Id == document.Id, PartitionKey);
|
|
||||||
Assert.AreEqual(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedAddOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = new CreateTestsPartitionedTKeyDocument();
|
|
||||||
// Act
|
|
||||||
await SUT.AddOneAsync<CreateTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsPartitionedTKeyDocument, Guid>(e => e.Id == document.Id, PartitionKey);
|
|
||||||
Assert.AreEqual(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedAddMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = new List<CreateTestsPartitionedTKeyDocument> { new CreateTestsPartitionedTKeyDocument(), new CreateTestsPartitionedTKeyDocument() };
|
|
||||||
// Act
|
|
||||||
SUT.AddMany<CreateTestsPartitionedTKeyDocument, Guid>(documents);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsPartitionedTKeyDocument, Guid>(e => e.Id == documents[0].Id || e.Id == documents[1].Id, PartitionKey);
|
|
||||||
Assert.AreEqual(2, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedAddManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = new List<CreateTestsPartitionedTKeyDocument> { new CreateTestsPartitionedTKeyDocument(), new CreateTestsPartitionedTKeyDocument() };
|
|
||||||
// Act
|
|
||||||
await SUT.AddManyAsync<CreateTestsPartitionedTKeyDocument, Guid>(documents);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsPartitionedTKeyDocument, Guid>(e => e.Id == documents[0].Id || e.Id == documents[1].Id, PartitionKey);
|
|
||||||
Assert.AreEqual(2, count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDB.Bson.Serialization.Attributes;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class CreateTestsTKeyDocument : IDocument<Guid>
|
|
||||||
{
|
|
||||||
[BsonId]
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Version { get; set; }
|
|
||||||
public CreateTestsTKeyDocument()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid();
|
|
||||||
Version = 2;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestFixture]
|
|
||||||
public class CreateTKeyTests : BaseMongoDbRepositoryTests<CreateTestsTKeyDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void TKeyAddOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = new CreateTestsTKeyDocument();
|
|
||||||
// Act
|
|
||||||
SUT.AddOne<CreateTestsTKeyDocument, Guid>(document);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsTKeyDocument, Guid>(e => e.Id == document.Id);
|
|
||||||
Assert.AreEqual(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task TKeyAddOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = new CreateTestsTKeyDocument();
|
|
||||||
// Act
|
|
||||||
await SUT.AddOneAsync<CreateTestsTKeyDocument, Guid>(document);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsTKeyDocument, Guid>(e => e.Id == document.Id);
|
|
||||||
Assert.AreEqual(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void TKeyAddMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = new List<CreateTestsTKeyDocument> { new CreateTestsTKeyDocument(), new CreateTestsTKeyDocument() };
|
|
||||||
// Act
|
|
||||||
SUT.AddMany<CreateTestsTKeyDocument, Guid>(documents);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsTKeyDocument, Guid>(e => e.Id == documents[0].Id || e.Id == documents[1].Id);
|
|
||||||
Assert.AreEqual(2, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task TKeyAddManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = new List<CreateTestsTKeyDocument> { new CreateTestsTKeyDocument(), new CreateTestsTKeyDocument() };
|
|
||||||
// Act
|
|
||||||
await SUT.AddManyAsync<CreateTestsTKeyDocument, Guid>(documents);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsTKeyDocument, Guid>(e => e.Id == documents[0].Id || e.Id == documents[1].Id);
|
|
||||||
Assert.AreEqual(2, count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class CreateTestsDocument : Document
|
|
||||||
{
|
|
||||||
public CreateTestsDocument()
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestFixture]
|
|
||||||
public class CreateTests : BaseMongoDbRepositoryTests<CreateTestsDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void AddOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = new CreateTestsDocument();
|
|
||||||
// Act
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsDocument>(e => e.Id == document.Id);
|
|
||||||
Assert.AreEqual(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task AddOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = new CreateTestsDocument();
|
|
||||||
// Act
|
|
||||||
await SUT.AddOneAsync(document);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsDocument>(e => e.Id == document.Id);
|
|
||||||
Assert.AreEqual(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void AddMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = new List<CreateTestsDocument> { new CreateTestsDocument(), new CreateTestsDocument() };
|
|
||||||
// Act
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsDocument>(e => e.Id == documents[0].Id || e.Id == documents[1].Id);
|
|
||||||
Assert.AreEqual(2, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task AddManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = new List<CreateTestsDocument> { new CreateTestsDocument(), new CreateTestsDocument() };
|
|
||||||
// Act
|
|
||||||
await SUT.AddManyAsync(documents);
|
|
||||||
// Assert
|
|
||||||
long count = SUT.Count<CreateTestsDocument>(e => e.Id == documents[0].Id || e.Id == documents[1].Id);
|
|
||||||
Assert.AreEqual(2, count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,137 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDB.Bson.Serialization.Attributes;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class DeleteTestsPartitionedTKeyDocument : IPartitionedDocument, IDocument<Guid>
|
|
||||||
{
|
|
||||||
[BsonId]
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Version { get; set; }
|
|
||||||
public DeleteTestsPartitionedTKeyDocument()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid();
|
|
||||||
Version = 2;
|
|
||||||
PartitionKey = "TestPartitionKey";
|
|
||||||
}
|
|
||||||
public string PartitionKey { get; set; }
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DeletePartitionedTKeyTests : BaseMongoDbRepositoryTests<DeleteTestsPartitionedTKeyDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void PartitionedDeleteOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<DeleteTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteOne<DeleteTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedTKeyDocument, Guid>(e => e.Id == document.Id, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedDeleteOneLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<DeleteTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteOne<DeleteTestsPartitionedTKeyDocument, Guid>(e => e.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedTKeyDocument, Guid>(e => e.Id == document.Id, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedDeleteOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<DeleteTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteOneAsync<DeleteTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedTKeyDocument, Guid>(e => e.Id == document.Id, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedDeleteOneAsyncLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<DeleteTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteOneAsync<DeleteTestsPartitionedTKeyDocument, Guid>(e => e.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedTKeyDocument, Guid>(e => e.Id == document.Id, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedDeleteManyAsyncLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "DeleteManyAsyncLinqContent");
|
|
||||||
SUT.AddMany<DeleteTestsPartitionedTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteManyAsync<DeleteTestsPartitionedTKeyDocument, Guid>(e => e.SomeContent == "DeleteManyAsyncLinqContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedTKeyDocument, Guid>(e => e.SomeContent == "DeleteManyAsyncLinqContent", PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedDeleteManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "DeleteManyAsyncLinqContent");
|
|
||||||
SUT.AddMany<DeleteTestsPartitionedTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteManyAsync<DeleteTestsPartitionedTKeyDocument, Guid>(documents);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedTKeyDocument, Guid>(e => e.SomeContent == "DeleteManyAsyncLinqContent", PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedDeleteManyLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var content = "DeleteManyLinqContent";
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = content);
|
|
||||||
SUT.AddMany<DeleteTestsPartitionedTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteMany<DeleteTestsPartitionedTKeyDocument, Guid>(e => e.SomeContent == content, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedTKeyDocument, Guid>(e => e.SomeContent == content, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedDeleteMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var content = "DeleteManyContent";
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = content);
|
|
||||||
SUT.AddMany<DeleteTestsPartitionedTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteMany<DeleteTestsPartitionedTKeyDocument, Guid>(documents);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedTKeyDocument, Guid>(e => e.SomeContent == content, PartitionKey));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class DeleteTestsPartitionedDocument : PartitionedDocument
|
|
||||||
{
|
|
||||||
public DeleteTestsPartitionedDocument() : base("TestPartitionKey")
|
|
||||||
{
|
|
||||||
Version = 1;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DeletePartitionedTests : BaseMongoDbRepositoryTests<DeleteTestsPartitionedDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void PartitionedDeleteOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteOne(document);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedDeleteOneLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteOne<DeleteTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedDeleteOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteOneAsync(document);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedDeleteOneAsyncLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteOneAsync<DeleteTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedDocument>(e => e.Id == document.Id, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedDeleteManyAsyncLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "DeleteManyAsyncLinqContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteManyAsync<DeleteTestsPartitionedDocument>(e => e.SomeContent == "DeleteManyAsyncLinqContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedDocument>(e => e.SomeContent == "DeleteManyAsyncLinqContent", PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedDeleteManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "DeleteManyAsyncLinqContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteManyAsync(documents);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedDocument>(e => e.SomeContent == "DeleteManyAsyncLinqContent", PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedDeleteManyLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var content = "DeleteManyLinqContent";
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = content);
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteMany<DeleteTestsPartitionedDocument>(e => e.SomeContent == content, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedDocument>(e => e.SomeContent == content, PartitionKey));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedDeleteMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var content = "DeleteManyContent";
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = content);
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteMany(documents);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsPartitionedDocument>(e => e.SomeContent == content, PartitionKey));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,135 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDB.Bson.Serialization.Attributes;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class DeleteTestsTKeyDocument : IDocument<Guid>
|
|
||||||
{
|
|
||||||
[BsonId]
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Version { get; set; }
|
|
||||||
public DeleteTestsTKeyDocument()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid();
|
|
||||||
Version = 2;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DeleteTKeyTests : BaseMongoDbRepositoryTests<DeleteTestsTKeyDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void DeleteOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<DeleteTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteOne<DeleteTestsTKeyDocument, Guid>(document);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsTKeyDocument, Guid>(e => e.Id == document.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void DeleteOneLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<DeleteTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteOne<DeleteTestsTKeyDocument, Guid>(e => e.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsTKeyDocument, Guid>(e => e.Id == document.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task DeleteOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<DeleteTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteOneAsync<DeleteTestsTKeyDocument, Guid>(document);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsTKeyDocument, Guid>(e => e.Id == document.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task DeleteOneAsyncLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<DeleteTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteOneAsync<DeleteTestsTKeyDocument, Guid>(e => e.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsTKeyDocument, Guid>(e => e.Id == document.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task DeleteManyAsyncLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "DeleteManyAsyncLinqContent");
|
|
||||||
SUT.AddMany<DeleteTestsTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteManyAsync<DeleteTestsTKeyDocument, Guid>(e => e.SomeContent == "DeleteManyAsyncLinqContent");
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsTKeyDocument, Guid>(e => e.SomeContent == "DeleteManyAsyncLinqContent"));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task DeleteManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "DeleteManyAsyncLinqContent");
|
|
||||||
SUT.AddMany<DeleteTestsTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteManyAsync<DeleteTestsTKeyDocument, Guid>(documents);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsTKeyDocument, Guid>(e => e.SomeContent == "DeleteManyAsyncLinqContent"));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void DeleteManyLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var content = "DeleteManyLinqContent";
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = content);
|
|
||||||
SUT.AddMany<DeleteTestsTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteMany<DeleteTestsTKeyDocument, Guid>(e => e.SomeContent == content);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsTKeyDocument, Guid>(e => e.SomeContent == content));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void DeleteMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var content = "DeleteManyContent";
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = content);
|
|
||||||
SUT.AddMany<DeleteTestsTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteMany<DeleteTestsTKeyDocument, Guid>(documents);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsTKeyDocument, Guid>(e => e.SomeContent == content));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,129 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class DeleteTestsDocument : Document
|
|
||||||
{
|
|
||||||
public DeleteTestsDocument()
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class DeleteTests : BaseMongoDbRepositoryTests<DeleteTestsDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void DeleteOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteOne(document);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsDocument>(e => e.Id == document.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void DeleteOneLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteOne<DeleteTestsDocument>(e => e.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsDocument>(e => e.Id == document.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task DeleteOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteOneAsync(document);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsDocument>(e => e.Id == document.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task DeleteOneAsyncLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteOneAsync<DeleteTestsDocument>(e => e.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsDocument>(e => e.Id == document.Id));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task DeleteManyAsyncLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "DeleteManyAsyncLinqContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteManyAsync<DeleteTestsDocument>(e => e.SomeContent == "DeleteManyAsyncLinqContent");
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsDocument>(e => e.SomeContent == "DeleteManyAsyncLinqContent"));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task DeleteManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "DeleteManyAsyncLinqContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.DeleteManyAsync(documents);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsDocument>(e => e.SomeContent == "DeleteManyAsyncLinqContent"));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void DeleteManyLinq()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var content = "DeleteManyLinqContent";
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = content);
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteMany<DeleteTestsDocument>(e => e.SomeContent == content);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsDocument>(e => e.SomeContent == content));
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void DeleteMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var content = "DeleteManyContent";
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = content);
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.DeleteMany(documents);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
Assert.IsFalse(SUT.Any<DeleteTestsDocument>(e => e.SomeContent == content));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace IntegrationTests.GroupTests
|
|
||||||
{
|
|
||||||
public class GroupingTestsDocument : Document
|
|
||||||
{
|
|
||||||
public GroupingTestsDocument()
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
Children = new List<Child>();
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
public int GroupingKey { get; set; }
|
|
||||||
public List<Child> Children { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProjectedGroup
|
|
||||||
{
|
|
||||||
public int Key { get; set; }
|
|
||||||
public List<string> Content { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class GroupingTests : BaseMongoDbRepositoryTests<GroupingTestsDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void GroupByTProjection()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
for(var i = 0; i < documents.Count - 2; i++)
|
|
||||||
{
|
|
||||||
documents[i].GroupingKey = 1;
|
|
||||||
documents[i].SomeContent = $"content-{i}";
|
|
||||||
}
|
|
||||||
for (var i = 3; i < documents.Count; i++)
|
|
||||||
{
|
|
||||||
documents[i].GroupingKey = 2;
|
|
||||||
documents[i].SomeContent = $"content-{i}";
|
|
||||||
}
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
|
|
||||||
var result = SUT.GroupBy<GroupingTestsDocument, int, ProjectedGroup>(
|
|
||||||
e => e.GroupingKey, g => new ProjectedGroup {
|
|
||||||
Key = g.Key,
|
|
||||||
Content = g.Select(doc => doc.SomeContent).ToList()
|
|
||||||
});
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
var key1Group = result.First(e => e.Key == 1);
|
|
||||||
Assert.NotNull(key1Group);
|
|
||||||
Assert.AreEqual(3, key1Group.Content.Count);
|
|
||||||
var key2Group = result.First(e => e.Key == 2);
|
|
||||||
Assert.NotNull(key2Group);
|
|
||||||
Assert.AreEqual(2, key2Group.Content.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void FilteredGroupByTProjection()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
for (var i = 0; i < documents.Count - 2; i++)
|
|
||||||
{
|
|
||||||
documents[i].GroupingKey = 4;
|
|
||||||
documents[i].SomeContent = $"content-{i}";
|
|
||||||
}
|
|
||||||
for (var i = 3; i < documents.Count; i++)
|
|
||||||
{
|
|
||||||
documents[i].GroupingKey = 5;
|
|
||||||
documents[i].SomeContent = $"content-{i}";
|
|
||||||
}
|
|
||||||
var guid1 = Guid.NewGuid().ToString("n");
|
|
||||||
var guid2 = Guid.NewGuid().ToString("n");
|
|
||||||
for (var i = 0; i < documents.Count - 1; i++)
|
|
||||||
{
|
|
||||||
documents[i].Children = new List<Child> {
|
|
||||||
new Child(guid1, guid2)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = SUT.GroupBy<GroupingTestsDocument, int, ProjectedGroup>(
|
|
||||||
e => e.Children.Any(c => c.Type == guid1),
|
|
||||||
e => e.GroupingKey, g => new ProjectedGroup
|
|
||||||
{
|
|
||||||
Key = g.Key,
|
|
||||||
Content = g.Select(doc => doc.SomeContent).ToList()
|
|
||||||
});
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
var key1Group = result.First(e => e.Key == 4);
|
|
||||||
Assert.NotNull(key1Group);
|
|
||||||
Assert.AreEqual(3, key1Group.Content.Count);
|
|
||||||
var key2Group = result.First(e => e.Key == 5);
|
|
||||||
Assert.NotNull(key2Group);
|
|
||||||
Assert.AreEqual(1, key2Group.Content.Count);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
namespace IntegrationTests.Infrastructure
|
|
||||||
{
|
|
||||||
public class Child
|
|
||||||
{
|
|
||||||
public Child(string type, string value)
|
|
||||||
{
|
|
||||||
Type = type;
|
|
||||||
Value = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
public string Type { get; set; }
|
|
||||||
public string Value { get; set; }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace IntegrationTests.Infrastructure
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A class holding global variables.
|
||||||
|
/// </summary>
|
||||||
|
public static class GlobalVariables
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A random number generator.
|
||||||
|
/// </summary>
|
||||||
|
public static Random Random = new Random();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,821 @@
|
|||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Configuration;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace IntegrationTests.Infrastructure
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public abstract class MongoDbDocumentTestBase<T>
|
||||||
|
where T: TestDoc, new()
|
||||||
|
{
|
||||||
|
public T CreateTestDocument()
|
||||||
|
{
|
||||||
|
return new T();
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract string GetClassName();
|
||||||
|
|
||||||
|
public List<T> CreateTestDocuments(int numberOfDocumentsToCreate)
|
||||||
|
{
|
||||||
|
var docs = new List<T>();
|
||||||
|
for (var i = 0; i < numberOfDocumentsToCreate; i++)
|
||||||
|
{
|
||||||
|
docs.Add(new T());
|
||||||
|
}
|
||||||
|
return docs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The partition key for the collection, if any
|
||||||
|
/// </summary>
|
||||||
|
protected string PartitionKey { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// the name of the test class
|
||||||
|
/// </summary>
|
||||||
|
protected string TestClassName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The name of the document used for tests
|
||||||
|
/// </summary>
|
||||||
|
protected string DocumentTypeName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SUT: System Under Test
|
||||||
|
/// </summary>
|
||||||
|
protected static ITestRepository SUT { get; set; }
|
||||||
|
|
||||||
|
public MongoDbDocumentTestBase()
|
||||||
|
{
|
||||||
|
var type = CreateTestDocument();
|
||||||
|
DocumentTypeName = type.GetType().FullName;
|
||||||
|
if (type is IPartitionedDocument)
|
||||||
|
{
|
||||||
|
PartitionKey = ((IPartitionedDocument)type).PartitionKey;
|
||||||
|
}
|
||||||
|
TestClassName = GetClassName();
|
||||||
|
}
|
||||||
|
|
||||||
|
[OneTimeSetUp]
|
||||||
|
public void Init()
|
||||||
|
{
|
||||||
|
var connectionString = ConfigurationManager.ConnectionStrings["MongoDbTests"].ConnectionString;
|
||||||
|
SUT = new TestRepository(connectionString, "MongoDbTests");
|
||||||
|
}
|
||||||
|
|
||||||
|
[OneTimeTearDown]
|
||||||
|
public void Cleanup()
|
||||||
|
{
|
||||||
|
// We drop the collection at the end of each test session.
|
||||||
|
if (!string.IsNullOrEmpty(PartitionKey))
|
||||||
|
{
|
||||||
|
SUT.DropTestCollection<T>(PartitionKey);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SUT.DropTestCollection<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Add
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void AddOne()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = new T();
|
||||||
|
// Act
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Assert
|
||||||
|
long count = string.IsNullOrEmpty(PartitionKey) ? SUT.Count<T>(e => e.Id.Equals(document.Id))
|
||||||
|
: SUT.Count<T>(e => e.Id.Equals(document.Id), PartitionKey);
|
||||||
|
Assert.AreEqual(1, count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task AddOneAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = new T();
|
||||||
|
// Act
|
||||||
|
await SUT.AddOneAsync<T>(document);
|
||||||
|
// Assert
|
||||||
|
long count = string.IsNullOrEmpty(PartitionKey) ? SUT.Count<T>(e => e.Id.Equals(document.Id))
|
||||||
|
: SUT.Count<T>(e => e.Id.Equals(document.Id), PartitionKey);
|
||||||
|
Assert.AreEqual(1, count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void AddMany()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = new List<T> { new T(), new T() };
|
||||||
|
// Act
|
||||||
|
SUT.AddMany<T>(documents);
|
||||||
|
// Assert
|
||||||
|
long count = string.IsNullOrEmpty(PartitionKey) ? SUT.Count<T>(e => e.Id.Equals(documents[0].Id)
|
||||||
|
|| e.Id.Equals(documents[1].Id))
|
||||||
|
: SUT.Count<T>(e => e.Id.Equals(documents[0].Id)
|
||||||
|
|| e.Id.Equals(documents[1].Id), PartitionKey);
|
||||||
|
Assert.AreEqual(2, count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task AddManyAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = new List<T> { new T(), new T() };
|
||||||
|
// Act
|
||||||
|
await SUT.AddManyAsync<T>(documents);
|
||||||
|
// Assert
|
||||||
|
long count = string.IsNullOrEmpty(PartitionKey) ? SUT.Count<T>(e => e.Id.Equals(documents[0].Id)
|
||||||
|
|| e.Id.Equals(documents[1].Id))
|
||||||
|
: SUT.Count<T>(e => e.Id.Equals(documents[0].Id)
|
||||||
|
|| e.Id.Equals(documents[1].Id), PartitionKey);
|
||||||
|
Assert.AreEqual(2, count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endregion Add
|
||||||
|
|
||||||
|
#region Read
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task GetByIdAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.GetByIdAsync<T>(document.Id, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsNotNull(result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetById()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.GetById<T>(document.Id, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsNotNull(result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task GetOneAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.GetOneAsync<T>(x => x.Id.Equals(document.Id), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsNotNull(result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetOne()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.GetOne<T>(x => x.Id.Equals(document.Id), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsNotNull(result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetCursor()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var cursor = SUT.GetCursor<T>(x => x.Id.Equals(document.Id), PartitionKey);
|
||||||
|
var count = cursor.Count();
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(1, count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task AnyAsyncReturnsTrue()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.AnyAsync<T>(x => x.Id.Equals(document.Id), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(true, result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task AnyAsyncReturnsFalse()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.AnyAsync<T>(x => x.Id.Equals(Guid.NewGuid()), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(false, result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void AnyReturnsTrue()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.Any<T>(x => x.Id.Equals(document.Id), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(true, result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void AnyReturnsFalse()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.Any<T>(x => x.Id.Equals(Guid.NewGuid()), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(false, result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task GetAllAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
var content = GetContent();
|
||||||
|
documents.ForEach(e => e.SomeContent = content);
|
||||||
|
SUT.AddMany<T>(documents);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.GetAllAsync<T>(x => x.SomeContent == content, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result.Count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetAll()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
var content = GetContent();
|
||||||
|
documents.ForEach(e => e.SomeContent = content);
|
||||||
|
SUT.AddMany<T>(documents);
|
||||||
|
// Act
|
||||||
|
var result = SUT.GetAll<T>(x => x.SomeContent == content, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result.Count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task CountAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
var content = GetContent();
|
||||||
|
documents.ForEach(e => e.SomeContent = content);
|
||||||
|
SUT.AddMany<T>(documents);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.CountAsync<T>(x => x.SomeContent == content, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Count()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
var content = GetContent();
|
||||||
|
documents.ForEach(e => e.SomeContent = content);
|
||||||
|
SUT.AddMany<T>(documents);
|
||||||
|
// Act
|
||||||
|
var result = SUT.Count<T>(x => x.SomeContent == content, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Read
|
||||||
|
|
||||||
|
#region Update
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void UpdateOne()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
var content = GetContent();
|
||||||
|
document.SomeContent = content;
|
||||||
|
// Act
|
||||||
|
var result = SUT.UpdateOne<T>(document);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result);
|
||||||
|
var updatedDocument = SUT.GetById<T>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument, GetTestName());
|
||||||
|
Assert.AreEqual(content, updatedDocument.SomeContent, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task UpdateOneAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
var content = GetContent();
|
||||||
|
document.SomeContent = content;
|
||||||
|
// Act
|
||||||
|
var result = await SUT.UpdateOneAsync<T>(document);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result);
|
||||||
|
var updatedDocument = SUT.GetById<T>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument, GetTestName());
|
||||||
|
Assert.AreEqual(content, updatedDocument.SomeContent, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void UpdateOneField()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
var content = GetContent();
|
||||||
|
// Act
|
||||||
|
var result = SUT.UpdateOne<T, string>(document, x => x.SomeContent, content);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result, GetTestName());
|
||||||
|
var updatedDocument = SUT.GetById<T>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument, GetTestName());
|
||||||
|
Assert.AreEqual(content, updatedDocument.SomeContent, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task UpdateOneFieldAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
var content = GetContent();
|
||||||
|
// Act
|
||||||
|
var result = await SUT.UpdateOneAsync<T, string>(document, x => x.SomeContent, content);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result, GetTestName());
|
||||||
|
var updatedDocument = SUT.GetById<T>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument, GetTestName());
|
||||||
|
Assert.AreEqual(content, updatedDocument.SomeContent, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void UpdateOneFieldWithFilter()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
var content = GetContent();
|
||||||
|
// Act
|
||||||
|
var result = SUT.UpdateOne<T, string>(x => x.Id.Equals(document.Id), x => x.SomeContent, content, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result, GetTestName());
|
||||||
|
var updatedDocument = SUT.GetById<T>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument, GetTestName());
|
||||||
|
Assert.AreEqual(content, updatedDocument.SomeContent, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task UpdateOneFieldWithFilterAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
var content = GetContent();
|
||||||
|
// Act
|
||||||
|
var result = await SUT.UpdateOneAsync<T, string>(x => x.Id.Equals(document.Id), x => x.SomeContent, content, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result, GetTestName());
|
||||||
|
var updatedDocument = SUT.GetById<T>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument, GetTestName());
|
||||||
|
Assert.AreEqual(content, updatedDocument.SomeContent, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task UpdateOneAsyncWithUpdateDefinition()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
var childrenToAdd = new List<Child>
|
||||||
|
{
|
||||||
|
new Child("testType1", "testValue1"),
|
||||||
|
new Child("testType2", "testValue2")
|
||||||
|
};
|
||||||
|
|
||||||
|
var updateDef = MongoDB.Driver.Builders<T>.Update.AddToSetEach(p => p.Children, childrenToAdd);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = await SUT.UpdateOneAsync<T>(document, updateDef);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result);
|
||||||
|
var updatedDocument = SUT.GetById<T>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument);
|
||||||
|
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type, GetTestName());
|
||||||
|
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value, GetTestName());
|
||||||
|
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type, GetTestName());
|
||||||
|
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void UpdateOneWithUpdateDefinition()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
var childrenToAdd = new List<Child>
|
||||||
|
{
|
||||||
|
new Child("testType1", "testValue1"),
|
||||||
|
new Child("testType2", "testValue2")
|
||||||
|
};
|
||||||
|
|
||||||
|
var updateDef = MongoDB.Driver.Builders<T>.Update.AddToSetEach(p => p.Children, childrenToAdd);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = SUT.UpdateOne<T>(document, updateDef);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result);
|
||||||
|
var updatedDocument = SUT.GetById<T>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument);
|
||||||
|
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type, GetTestName());
|
||||||
|
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value, GetTestName());
|
||||||
|
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type, GetTestName());
|
||||||
|
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Update
|
||||||
|
|
||||||
|
#region Delete
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void DeleteOne()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.DeleteOne<T>(document);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(1, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T>(e => e.Id.Equals(document.Id), PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void DeleteOneLinq()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.DeleteOne<T>(e => e.Id.Equals(document.Id), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(1, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T>(e => e.Id.Equals(document.Id), PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task DeleteOneAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.DeleteOneAsync<T>(document);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(1, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T>(e => e.Id.Equals(document.Id), PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task DeleteOneAsyncLinq()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.DeleteOneAsync<T>(e => e.Id.Equals(document.Id), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(1, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T>(e => e.Id.Equals(document.Id), PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task DeleteManyAsyncLinq()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var criteria = $"{GetTestName()}.{DocumentTypeName}";
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
documents.ForEach(e => e.SomeContent = criteria);
|
||||||
|
SUT.AddMany<T>(documents);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.DeleteManyAsync<T>(e => e.SomeContent == criteria, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T>(e => e.SomeContent == criteria, PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task DeleteManyAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var criteria = $"{GetTestName()}.{DocumentTypeName}";
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
documents.ForEach(e => e.SomeContent = criteria);
|
||||||
|
SUT.AddMany<T>(documents);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.DeleteManyAsync<T>(documents);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T>(e => e.SomeContent == criteria, PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void DeleteManyLinq()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var criteria = $"{GetTestName()}.{DocumentTypeName}";
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
documents.ForEach(e => e.SomeContent = criteria);
|
||||||
|
SUT.AddMany<T>(documents);
|
||||||
|
// Act
|
||||||
|
var result = SUT.DeleteMany<T>(e => e.SomeContent == criteria, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T>(e => e.SomeContent == criteria, PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void DeleteMany()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var criteria = $"{GetTestName()}.{DocumentTypeName}";
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
documents.ForEach(e => e.SomeContent = criteria);
|
||||||
|
SUT.AddMany<T>(documents);
|
||||||
|
// Act
|
||||||
|
var result = SUT.DeleteMany<T>(documents);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T>(e => e.SomeContent == criteria, PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Delete
|
||||||
|
|
||||||
|
#region Project
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task ProjectOneAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var someContent = GetContent();
|
||||||
|
var someDate = DateTime.UtcNow;
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
document.SomeContent = someContent;
|
||||||
|
document.Nested.SomeDate = someDate;
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.ProjectOneAsync<T, MyTestProjection>(
|
||||||
|
x => x.Id.Equals(document.Id),
|
||||||
|
x => new MyTestProjection
|
||||||
|
{
|
||||||
|
SomeContent = x.SomeContent,
|
||||||
|
SomeDate = x.Nested.SomeDate
|
||||||
|
},
|
||||||
|
PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsNotNull(result, GetTestName());
|
||||||
|
Assert.AreEqual(someContent, result.SomeContent, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Minute, result.SomeDate.Minute, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Second, result.SomeDate.Second, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ProjectOne()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var someContent = GetContent();
|
||||||
|
var someDate = DateTime.UtcNow;
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
document.SomeContent = someContent;
|
||||||
|
document.Nested.SomeDate = someDate;
|
||||||
|
SUT.AddOne<T>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.ProjectOne<T, MyTestProjection>(
|
||||||
|
x => x.Id.Equals(document.Id),
|
||||||
|
x => new MyTestProjection
|
||||||
|
{
|
||||||
|
SomeContent = x.SomeContent,
|
||||||
|
SomeDate = x.Nested.SomeDate
|
||||||
|
},
|
||||||
|
PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsNotNull(result, GetTestName());
|
||||||
|
Assert.AreEqual(someContent, result.SomeContent, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Minute, result.SomeDate.Minute, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Second, result.SomeDate.Second, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task ProjectManyAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var someContent = GetContent();
|
||||||
|
var someDate = DateTime.UtcNow;
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
documents.ForEach(e =>
|
||||||
|
{
|
||||||
|
e.SomeContent = someContent;
|
||||||
|
e.Nested.SomeDate = someDate;
|
||||||
|
});
|
||||||
|
|
||||||
|
SUT.AddMany<T>(documents);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.ProjectManyAsync<T, MyTestProjection>(
|
||||||
|
x => x.SomeContent == someContent,
|
||||||
|
x => new MyTestProjection
|
||||||
|
{
|
||||||
|
SomeContent = x.SomeContent,
|
||||||
|
SomeDate = x.Nested.SomeDate
|
||||||
|
},
|
||||||
|
PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result.Count, GetTestName());
|
||||||
|
Assert.AreEqual(someContent, result.First().SomeContent, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Minute, result.First().SomeDate.Minute, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Second, result.First().SomeDate.Second, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ProjectMany()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var someContent = GetContent();
|
||||||
|
var someDate = DateTime.UtcNow;
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
documents.ForEach(e =>
|
||||||
|
{
|
||||||
|
e.SomeContent = someContent;
|
||||||
|
e.Nested.SomeDate = someDate;
|
||||||
|
});
|
||||||
|
|
||||||
|
SUT.AddMany<T>(documents);
|
||||||
|
// Act
|
||||||
|
var result = SUT.ProjectMany<T, MyTestProjection>(
|
||||||
|
x => x.SomeContent == someContent,
|
||||||
|
x => new MyTestProjection
|
||||||
|
{
|
||||||
|
SomeContent = x.SomeContent,
|
||||||
|
SomeDate = x.Nested.SomeDate
|
||||||
|
},
|
||||||
|
PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result.Count, GetTestName());
|
||||||
|
Assert.AreEqual(someContent, result.First().SomeContent, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Minute, result.First().SomeDate.Minute, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Second, result.First().SomeDate.Second, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Project
|
||||||
|
|
||||||
|
#region Group By
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GroupByTProjection()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
var content = GetContent();
|
||||||
|
for (var i = 0; i < documents.Count - 2; i++)
|
||||||
|
{
|
||||||
|
documents[i].GroupingKey = 1;
|
||||||
|
documents[i].SomeContent = $"{content}-{i}";
|
||||||
|
}
|
||||||
|
for (var i = 3; i < documents.Count; i++)
|
||||||
|
{
|
||||||
|
documents[i].GroupingKey = 2;
|
||||||
|
documents[i].SomeContent = $"{content}-{i}";
|
||||||
|
}
|
||||||
|
SUT.AddMany(documents);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = SUT.GroupBy<T, int, ProjectedGroup>(
|
||||||
|
e => e.GroupingKey, g => new ProjectedGroup
|
||||||
|
{
|
||||||
|
Key = g.Key,
|
||||||
|
Content = g.Select(doc => doc.SomeContent).ToList()
|
||||||
|
},
|
||||||
|
PartitionKey);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
var key1Group = result.First(e => e.Key == 1);
|
||||||
|
Assert.NotNull(key1Group);
|
||||||
|
Assert.AreEqual(3, key1Group.Content.Count);
|
||||||
|
var key2Group = result.First(e => e.Key == 2);
|
||||||
|
Assert.NotNull(key2Group);
|
||||||
|
Assert.AreEqual(2, key2Group.Content.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void FilteredGroupByTProjection()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
var content = GetContent();
|
||||||
|
for (var i = 0; i < documents.Count - 2; i++)
|
||||||
|
{
|
||||||
|
documents[i].GroupingKey = 4;
|
||||||
|
documents[i].SomeContent = $"{content}-{i}";
|
||||||
|
}
|
||||||
|
for (var i = 3; i < documents.Count; i++)
|
||||||
|
{
|
||||||
|
documents[i].GroupingKey = 5;
|
||||||
|
documents[i].SomeContent = $"{content}-{i}";
|
||||||
|
}
|
||||||
|
var guid1 = Guid.NewGuid().ToString("n");
|
||||||
|
var guid2 = Guid.NewGuid().ToString("n");
|
||||||
|
for (var i = 0; i < documents.Count - 1; i++)
|
||||||
|
{
|
||||||
|
documents[i].Children = new List<Child> {
|
||||||
|
new Child(guid1, guid2)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
SUT.AddMany(documents);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = SUT.GroupBy<T, int, ProjectedGroup>(
|
||||||
|
e => e.Children.Any(c => c.Type == guid1),
|
||||||
|
e => e.GroupingKey, g => new ProjectedGroup
|
||||||
|
{
|
||||||
|
Key = g.Key,
|
||||||
|
Content = g.Select(doc => doc.SomeContent).ToList()
|
||||||
|
}, PartitionKey);
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
var key1Group = result.First(e => e.Key == 4);
|
||||||
|
Assert.NotNull(key1Group);
|
||||||
|
Assert.AreEqual(3, key1Group.Content.Count);
|
||||||
|
var key2Group = result.First(e => e.Key == 5);
|
||||||
|
Assert.NotNull(key2Group);
|
||||||
|
Assert.AreEqual(1, key2Group.Content.Count);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Group By
|
||||||
|
|
||||||
|
#region Test Utils
|
||||||
|
|
||||||
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||||
|
private string GetCurrentMethod()
|
||||||
|
{
|
||||||
|
StackTrace st = new StackTrace();
|
||||||
|
StackFrame sf = st.GetFrame(1);
|
||||||
|
|
||||||
|
return sf.GetMethod().Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||||
|
private string GetParentMethod()
|
||||||
|
{
|
||||||
|
StackTrace st = new StackTrace();
|
||||||
|
StackFrame sf = st.GetFrame(2);
|
||||||
|
var method = sf.GetMethod().DeclaringType.Name;
|
||||||
|
return method;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetTestName()
|
||||||
|
{
|
||||||
|
return $"{TestClassName}{PartitionKey}.{GetParentMethod()}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetContent()
|
||||||
|
{
|
||||||
|
return $"{TestClassName}{PartitionKey}.{Guid.NewGuid()}.{GetParentMethod()}";
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Test Utils
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,735 @@
|
|||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Configuration;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace IntegrationTests.Infrastructure
|
||||||
|
{
|
||||||
|
[TestFixture]
|
||||||
|
public abstract class MongoDbTKeyDocumentTestBase<T, TKey>
|
||||||
|
where T: TestDoc<TKey>, new()
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
public T CreateTestDocument()
|
||||||
|
{
|
||||||
|
return new T();
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract string GetClassName();
|
||||||
|
|
||||||
|
public List<T> CreateTestDocuments(int numberOfDocumentsToCreate)
|
||||||
|
{
|
||||||
|
var docs = new List<T>();
|
||||||
|
for (var i = 0; i < numberOfDocumentsToCreate; i++)
|
||||||
|
{
|
||||||
|
docs.Add(new T());
|
||||||
|
}
|
||||||
|
return docs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The partition key for the collection, if any
|
||||||
|
/// </summary>
|
||||||
|
protected string PartitionKey { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// the name of the test class
|
||||||
|
/// </summary>
|
||||||
|
protected string TestClassName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The name of the document used for tests
|
||||||
|
/// </summary>
|
||||||
|
protected string DocumentTypeName { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// SUT: System Under Test
|
||||||
|
/// </summary>
|
||||||
|
protected static ITestRepository SUT { get; set; }
|
||||||
|
|
||||||
|
public MongoDbTKeyDocumentTestBase()
|
||||||
|
{
|
||||||
|
var type = CreateTestDocument();
|
||||||
|
DocumentTypeName = type.GetType().FullName;
|
||||||
|
if (type is IPartitionedDocument)
|
||||||
|
{
|
||||||
|
PartitionKey = ((IPartitionedDocument)type).PartitionKey;
|
||||||
|
}
|
||||||
|
TestClassName = GetClassName();
|
||||||
|
}
|
||||||
|
|
||||||
|
[OneTimeSetUp]
|
||||||
|
public void Init()
|
||||||
|
{
|
||||||
|
var connectionString = ConfigurationManager.ConnectionStrings["MongoDbTests"].ConnectionString;
|
||||||
|
SUT = new TestRepository(connectionString, "MongoDbTests");
|
||||||
|
}
|
||||||
|
|
||||||
|
[OneTimeTearDown]
|
||||||
|
public void Cleanup()
|
||||||
|
{
|
||||||
|
// We drop the collection at the end of each test session.
|
||||||
|
if (!string.IsNullOrEmpty(PartitionKey))
|
||||||
|
{
|
||||||
|
SUT.DropTestCollection<T>(PartitionKey);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SUT.DropTestCollection<T>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Add
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void AddOne()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = new T();
|
||||||
|
// Act
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Assert
|
||||||
|
long count = string.IsNullOrEmpty(PartitionKey) ? SUT.Count<T, TKey>(e => e.Id.Equals(document.Id))
|
||||||
|
: SUT.Count<T, TKey>(e => e.Id.Equals(document.Id), PartitionKey);
|
||||||
|
Assert.AreEqual(1, count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task AddOneAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = new T();
|
||||||
|
// Act
|
||||||
|
await SUT.AddOneAsync<T, TKey>(document);
|
||||||
|
// Assert
|
||||||
|
long count = string.IsNullOrEmpty(PartitionKey) ? SUT.Count<T, TKey>(e => e.Id.Equals(document.Id))
|
||||||
|
: SUT.Count<T, TKey>(e => e.Id.Equals(document.Id), PartitionKey);
|
||||||
|
Assert.AreEqual(1, count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void AddMany()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = new List<T> { new T(), new T() };
|
||||||
|
// Act
|
||||||
|
SUT.AddMany<T, TKey>(documents);
|
||||||
|
// Assert
|
||||||
|
long count = string.IsNullOrEmpty(PartitionKey) ? SUT.Count<T, TKey>(e => e.Id.Equals(documents[0].Id)
|
||||||
|
|| e.Id.Equals(documents[1].Id))
|
||||||
|
: SUT.Count<T, TKey>(e => e.Id.Equals(documents[0].Id)
|
||||||
|
|| e.Id.Equals(documents[1].Id), PartitionKey);
|
||||||
|
Assert.AreEqual(2, count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task AddManyAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = new List<T> { new T(), new T() };
|
||||||
|
// Act
|
||||||
|
await SUT.AddManyAsync<T, TKey>(documents);
|
||||||
|
// Assert
|
||||||
|
long count = string.IsNullOrEmpty(PartitionKey) ? SUT.Count<T, TKey>(e => e.Id.Equals(documents[0].Id)
|
||||||
|
|| e.Id.Equals(documents[1].Id))
|
||||||
|
: SUT.Count<T, TKey>(e => e.Id.Equals(documents[0].Id)
|
||||||
|
|| e.Id.Equals(documents[1].Id), PartitionKey);
|
||||||
|
Assert.AreEqual(2, count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endregion Add
|
||||||
|
|
||||||
|
#region Read
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task GetByIdAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.GetByIdAsync<T, TKey>(document.Id, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsNotNull(result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetById()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.GetById<T, TKey>(document.Id, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsNotNull(result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task GetOneAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.GetOneAsync<T, TKey>(x => x.Id.Equals(document.Id), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsNotNull(result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetOne()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.GetOne<T, TKey>(x => x.Id.Equals(document.Id), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsNotNull(result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetCursor()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var cursor = SUT.GetCursor<T, TKey>(x => x.Id.Equals(document.Id), PartitionKey);
|
||||||
|
var count = cursor.Count();
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(1, count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task AnyAsyncReturnsTrue()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.AnyAsync<T, TKey>(x => x.Id.Equals(document.Id), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(true, result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task AnyAsyncReturnsFalse()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.AnyAsync<T, TKey>(x => x.Id.Equals(document.Init<TKey>()), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(false, result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void AnyReturnsTrue()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.Any<T, TKey>(x => x.Id.Equals(document.Id), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(true, result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void AnyReturnsFalse()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.Any<T, TKey>(x => x.Id.Equals(document.Init<TKey>()), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(false, result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task GetAllAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
var content = GetContent();
|
||||||
|
documents.ForEach(e => e.SomeContent = content);
|
||||||
|
SUT.AddMany<T, TKey>(documents);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.GetAllAsync<T, TKey>(x => x.SomeContent == content, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result.Count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void GetAll()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
var content = GetContent();
|
||||||
|
documents.ForEach(e => e.SomeContent = content);
|
||||||
|
SUT.AddMany<T, TKey>(documents);
|
||||||
|
// Act
|
||||||
|
var result = SUT.GetAll<T, TKey>(x => x.SomeContent == content, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result.Count, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task CountAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
var content = GetContent();
|
||||||
|
documents.ForEach(e => e.SomeContent = content);
|
||||||
|
SUT.AddMany<T, TKey>(documents);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.CountAsync<T, TKey>(x => x.SomeContent == content, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void Count()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
var content = GetContent();
|
||||||
|
documents.ForEach(e => e.SomeContent = content);
|
||||||
|
SUT.AddMany<T, TKey>(documents);
|
||||||
|
// Act
|
||||||
|
var result = SUT.Count<T, TKey>(x => x.SomeContent == content, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Read
|
||||||
|
|
||||||
|
#region Update
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void UpdateOne()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
var content = GetContent();
|
||||||
|
document.SomeContent = content;
|
||||||
|
// Act
|
||||||
|
var result = SUT.UpdateOne<T, TKey>(document);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result);
|
||||||
|
var updatedDocument = SUT.GetById<T, TKey>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument, GetTestName());
|
||||||
|
Assert.AreEqual(content, updatedDocument.SomeContent, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task UpdateOneAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
var content = GetContent();
|
||||||
|
document.SomeContent = content;
|
||||||
|
// Act
|
||||||
|
var result = await SUT.UpdateOneAsync<T, TKey>(document);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result);
|
||||||
|
var updatedDocument = SUT.GetById<T, TKey>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument, GetTestName());
|
||||||
|
Assert.AreEqual(content, updatedDocument.SomeContent, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void UpdateOneField()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
var content = GetContent();
|
||||||
|
// Act
|
||||||
|
var result = SUT.UpdateOne<T, TKey, string>(document, x => x.SomeContent, content);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result, GetTestName());
|
||||||
|
var updatedDocument = SUT.GetById<T, TKey>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument, GetTestName());
|
||||||
|
Assert.AreEqual(content, updatedDocument.SomeContent, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task UpdateOneFieldAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
var content = GetContent();
|
||||||
|
// Act
|
||||||
|
var result = await SUT.UpdateOneAsync<T, TKey, string>(document, x => x.SomeContent, content);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result, GetTestName());
|
||||||
|
var updatedDocument = SUT.GetById<T, TKey>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument, GetTestName());
|
||||||
|
Assert.AreEqual(content, updatedDocument.SomeContent, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void UpdateOneFieldWithFilter()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
var content = GetContent();
|
||||||
|
// Act
|
||||||
|
var result = SUT.UpdateOne<T, TKey, string>(x => x.Id.Equals(document.Id), x => x.SomeContent, content, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result, GetTestName());
|
||||||
|
var updatedDocument = SUT.GetById<T, TKey>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument, GetTestName());
|
||||||
|
Assert.AreEqual(content, updatedDocument.SomeContent, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task UpdateOneFieldWithFilterAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
var content = GetContent();
|
||||||
|
// Act
|
||||||
|
var result = await SUT.UpdateOneAsync<T, TKey, string>(x => x.Id.Equals(document.Id), x => x.SomeContent, content, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result, GetTestName());
|
||||||
|
var updatedDocument = SUT.GetById<T, TKey>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument, GetTestName());
|
||||||
|
Assert.AreEqual(content, updatedDocument.SomeContent, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task UpdateOneAsyncWithUpdateDefinition()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
var childrenToAdd = new List<Child>
|
||||||
|
{
|
||||||
|
new Child("testType1", "testValue1"),
|
||||||
|
new Child("testType2", "testValue2")
|
||||||
|
};
|
||||||
|
|
||||||
|
var updateDef = MongoDB.Driver.Builders<T>.Update.AddToSetEach(p => p.Children, childrenToAdd);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = await SUT.UpdateOneAsync<T, TKey>(document, updateDef);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result);
|
||||||
|
var updatedDocument = SUT.GetById<T, TKey>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument);
|
||||||
|
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type, GetTestName());
|
||||||
|
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value, GetTestName());
|
||||||
|
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type, GetTestName());
|
||||||
|
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void UpdateOneWithUpdateDefinition()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
var childrenToAdd = new List<Child>
|
||||||
|
{
|
||||||
|
new Child("testType1", "testValue1"),
|
||||||
|
new Child("testType2", "testValue2")
|
||||||
|
};
|
||||||
|
|
||||||
|
var updateDef = MongoDB.Driver.Builders<T>.Update.AddToSetEach(p => p.Children, childrenToAdd);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = SUT.UpdateOne<T, TKey>(document, updateDef);
|
||||||
|
// Assert
|
||||||
|
Assert.IsTrue(result);
|
||||||
|
var updatedDocument = SUT.GetById<T, TKey>(document.Id, PartitionKey);
|
||||||
|
Assert.IsNotNull(updatedDocument);
|
||||||
|
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type, GetTestName());
|
||||||
|
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value, GetTestName());
|
||||||
|
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type, GetTestName());
|
||||||
|
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Update
|
||||||
|
|
||||||
|
#region Delete
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void DeleteOne()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.DeleteOne<T, TKey>(document);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(1, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T, TKey>(e => e.Id.Equals(document.Id), PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void DeleteOneLinq()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.DeleteOne<T, TKey>(e => e.Id.Equals(document.Id), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(1, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T, TKey>(e => e.Id.Equals(document.Id), PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task DeleteOneAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.DeleteOneAsync<T, TKey>(document);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(1, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T, TKey>(e => e.Id.Equals(document.Id), PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task DeleteOneAsyncLinq()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.DeleteOneAsync<T, TKey>(e => e.Id.Equals(document.Id), PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(1, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T, TKey>(e => e.Id.Equals(document.Id), PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task DeleteManyAsyncLinq()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var criteria = $"{GetTestName()}.{DocumentTypeName}";
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
documents.ForEach(e => e.SomeContent = criteria);
|
||||||
|
SUT.AddMany<T, TKey>(documents);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.DeleteManyAsync<T, TKey>(e => e.SomeContent == criteria, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T, TKey>(e => e.SomeContent == criteria, PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task DeleteManyAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var criteria = $"{GetTestName()}.{DocumentTypeName}";
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
documents.ForEach(e => e.SomeContent = criteria);
|
||||||
|
SUT.AddMany<T, TKey>(documents);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.DeleteManyAsync<T, TKey>(documents);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T, TKey>(e => e.SomeContent == criteria, PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void DeleteManyLinq()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var criteria = $"{GetTestName()}.{DocumentTypeName}";
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
documents.ForEach(e => e.SomeContent = criteria);
|
||||||
|
SUT.AddMany<T, TKey>(documents);
|
||||||
|
// Act
|
||||||
|
var result = SUT.DeleteMany<T, TKey>(e => e.SomeContent == criteria, PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T, TKey>(e => e.SomeContent == criteria, PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void DeleteMany()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var criteria = $"{GetTestName()}.{DocumentTypeName}";
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
documents.ForEach(e => e.SomeContent = criteria);
|
||||||
|
SUT.AddMany<T, TKey>(documents);
|
||||||
|
// Act
|
||||||
|
var result = SUT.DeleteMany<T, TKey>(documents);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result);
|
||||||
|
Assert.IsFalse(SUT.Any<T, TKey>(e => e.SomeContent == criteria, PartitionKey), GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Delete
|
||||||
|
|
||||||
|
#region Project
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task ProjectOneAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var someContent = GetContent();
|
||||||
|
var someDate = DateTime.UtcNow;
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
document.SomeContent = someContent;
|
||||||
|
document.Nested.SomeDate = someDate;
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.ProjectOneAsync<T, MyTestProjection, TKey>(
|
||||||
|
x => x.Id.Equals(document.Id),
|
||||||
|
x => new MyTestProjection
|
||||||
|
{
|
||||||
|
SomeContent = x.SomeContent,
|
||||||
|
SomeDate = x.Nested.SomeDate
|
||||||
|
},
|
||||||
|
PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsNotNull(result, GetTestName());
|
||||||
|
Assert.AreEqual(someContent, result.SomeContent, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Minute, result.SomeDate.Minute, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Second, result.SomeDate.Second, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ProjectOne()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var someContent = GetContent();
|
||||||
|
var someDate = DateTime.UtcNow;
|
||||||
|
var document = CreateTestDocument();
|
||||||
|
document.SomeContent = someContent;
|
||||||
|
document.Nested.SomeDate = someDate;
|
||||||
|
SUT.AddOne<T, TKey>(document);
|
||||||
|
// Act
|
||||||
|
var result = SUT.ProjectOne<T, MyTestProjection, TKey>(
|
||||||
|
x => x.Id.Equals(document.Id),
|
||||||
|
x => new MyTestProjection
|
||||||
|
{
|
||||||
|
SomeContent = x.SomeContent,
|
||||||
|
SomeDate = x.Nested.SomeDate
|
||||||
|
},
|
||||||
|
PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.IsNotNull(result, GetTestName());
|
||||||
|
Assert.AreEqual(someContent, result.SomeContent, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Minute, result.SomeDate.Minute, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Second, result.SomeDate.Second, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task ProjectManyAsync()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var someContent = GetContent();
|
||||||
|
var someDate = DateTime.UtcNow;
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
documents.ForEach(e =>
|
||||||
|
{
|
||||||
|
e.SomeContent = someContent;
|
||||||
|
e.Nested.SomeDate = someDate;
|
||||||
|
});
|
||||||
|
|
||||||
|
SUT.AddMany<T, TKey>(documents);
|
||||||
|
// Act
|
||||||
|
var result = await SUT.ProjectManyAsync<T, MyTestProjection, TKey>(
|
||||||
|
x => x.SomeContent == someContent,
|
||||||
|
x => new MyTestProjection
|
||||||
|
{
|
||||||
|
SomeContent = x.SomeContent,
|
||||||
|
SomeDate = x.Nested.SomeDate
|
||||||
|
},
|
||||||
|
PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result.Count, GetTestName());
|
||||||
|
Assert.AreEqual(someContent, result.First().SomeContent, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Minute, result.First().SomeDate.Minute, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Second, result.First().SomeDate.Second, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void ProjectMany()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var someContent = GetContent();
|
||||||
|
var someDate = DateTime.UtcNow;
|
||||||
|
var documents = CreateTestDocuments(5);
|
||||||
|
documents.ForEach(e =>
|
||||||
|
{
|
||||||
|
e.SomeContent = someContent;
|
||||||
|
e.Nested.SomeDate = someDate;
|
||||||
|
});
|
||||||
|
|
||||||
|
SUT.AddMany<T, TKey>(documents);
|
||||||
|
// Act
|
||||||
|
var result = SUT.ProjectMany<T, MyTestProjection, TKey>(
|
||||||
|
x => x.SomeContent == someContent,
|
||||||
|
x => new MyTestProjection
|
||||||
|
{
|
||||||
|
SomeContent = x.SomeContent,
|
||||||
|
SomeDate = x.Nested.SomeDate
|
||||||
|
},
|
||||||
|
PartitionKey);
|
||||||
|
// Assert
|
||||||
|
Assert.AreEqual(5, result.Count, GetTestName());
|
||||||
|
Assert.AreEqual(someContent, result.First().SomeContent, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Minute, result.First().SomeDate.Minute, GetTestName());
|
||||||
|
Assert.AreEqual(someDate.Second, result.First().SomeDate.Second, GetTestName());
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Project
|
||||||
|
|
||||||
|
#region Test Utils
|
||||||
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||||
|
private string GetCurrentMethod()
|
||||||
|
{
|
||||||
|
StackTrace st = new StackTrace();
|
||||||
|
StackFrame sf = st.GetFrame(1);
|
||||||
|
|
||||||
|
return sf.GetMethod().Name;
|
||||||
|
}
|
||||||
|
|
||||||
|
[MethodImpl(MethodImplOptions.NoInlining)]
|
||||||
|
private string GetParentMethod()
|
||||||
|
{
|
||||||
|
StackTrace st = new StackTrace();
|
||||||
|
StackFrame sf = st.GetFrame(2);
|
||||||
|
var method = sf.GetMethod().DeclaringType.Name;
|
||||||
|
return method;
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetTestName()
|
||||||
|
{
|
||||||
|
return $"{TestClassName}{PartitionKey}.{GetParentMethod()}";
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetContent()
|
||||||
|
{
|
||||||
|
return $"{TestClassName}{PartitionKey}.{Guid.NewGuid()}.{GetParentMethod()}";
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion Test Utils
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace IntegrationTests.Infrastructure
|
||||||
|
{
|
||||||
|
// Thanks BlueRaja - Danny Pflughoeft https://stackoverflow.com/a/13095144/5103354
|
||||||
|
/// <summary>
|
||||||
|
/// Extensions for the random number generator <see cref="Random"/>
|
||||||
|
/// </summary>
|
||||||
|
public static class RandomExtensions
|
||||||
|
{
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a random long from min (inclusive) to max (exclusive)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="random">The given random instance</param>
|
||||||
|
/// <param name="min">The inclusive minimum bound</param>
|
||||||
|
/// <param name="max">The exclusive maximum bound. Must be greater than min</param>
|
||||||
|
public static long NextLong(this Random random, long min, long max)
|
||||||
|
{
|
||||||
|
if (max <= min)
|
||||||
|
throw new ArgumentOutOfRangeException("max", "max must be > min!");
|
||||||
|
|
||||||
|
//Working with ulong so that modulo works correctly with values > long.MaxValue
|
||||||
|
ulong uRange = (ulong)(max - min);
|
||||||
|
|
||||||
|
//Prevent a modulo bias; see https://stackoverflow.com/a/10984975/238419
|
||||||
|
//for more information.
|
||||||
|
//In the worst case, the expected number of calls is 2 (though usually it's
|
||||||
|
//much closer to 1) so this loop doesn't really hurt performance at all.
|
||||||
|
ulong ulongRand;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
byte[] buf = new byte[8];
|
||||||
|
random.NextBytes(buf);
|
||||||
|
ulongRand = (ulong)BitConverter.ToInt64(buf, 0);
|
||||||
|
} while (ulongRand > ulong.MaxValue - ((ulong.MaxValue % uRange) + 1) % uRange);
|
||||||
|
|
||||||
|
return (long)(ulongRand % uRange) + min;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a random long from 0 (inclusive) to max (exclusive)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="random">The given random instance</param>
|
||||||
|
/// <param name="max">The exclusive maximum bound. Must be greater than 0</param>
|
||||||
|
public static long NextLong(this Random random, long max)
|
||||||
|
{
|
||||||
|
return random.NextLong(0, max);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns a random long over all possible values of long (except long.MaxValue, similar to
|
||||||
|
/// random.Next())
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="random">The given random instance</param>
|
||||||
|
public static long NextLong(this Random random)
|
||||||
|
{
|
||||||
|
return random.NextLong(long.MinValue, long.MaxValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using MongoDbGenericRepository.Utils;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace IntegrationTests.Infrastructure
|
||||||
|
{
|
||||||
|
public class ProjectedGroup
|
||||||
|
{
|
||||||
|
public int Key { get; set; }
|
||||||
|
public List<string> Content { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class MyTestProjection
|
||||||
|
{
|
||||||
|
public string SomeContent { get; set; }
|
||||||
|
public DateTime SomeDate { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Nested
|
||||||
|
{
|
||||||
|
public DateTime SomeDate { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Child
|
||||||
|
{
|
||||||
|
public Child(string type, string value)
|
||||||
|
{
|
||||||
|
Type = type;
|
||||||
|
Value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string Type { get; set; }
|
||||||
|
public string Value { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TestDoc : Document
|
||||||
|
{
|
||||||
|
public TestDoc()
|
||||||
|
{
|
||||||
|
Version = 2;
|
||||||
|
Nested = new Nested
|
||||||
|
{
|
||||||
|
SomeDate = DateTime.UtcNow
|
||||||
|
};
|
||||||
|
Children = new List<Child>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SomeContent { get; set; }
|
||||||
|
|
||||||
|
public int GroupingKey { get; set; }
|
||||||
|
|
||||||
|
public Nested Nested { get; set; }
|
||||||
|
|
||||||
|
public List<Child> Children { get; set; }
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class TestDoc<TKey> : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
[BsonId]
|
||||||
|
public TKey Id { get; set; }
|
||||||
|
public int Version { get; set; }
|
||||||
|
|
||||||
|
public TestDoc()
|
||||||
|
{
|
||||||
|
InitializeFields();
|
||||||
|
Version = 2;
|
||||||
|
Nested = new Nested
|
||||||
|
{
|
||||||
|
SomeDate = DateTime.UtcNow
|
||||||
|
};
|
||||||
|
Children = new List<Child>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public string SomeContent { get; set; }
|
||||||
|
|
||||||
|
public Nested Nested { get; set; }
|
||||||
|
|
||||||
|
public List<Child> Children { get; set; }
|
||||||
|
|
||||||
|
public TId Init<TId>()
|
||||||
|
{
|
||||||
|
return IdGenerator.GetId<TId>();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InitializeFields()
|
||||||
|
{
|
||||||
|
Id = Init<TKey>();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,9 @@
|
|||||||
using MongoDbGenericRepository;
|
using MongoDB.Driver;
|
||||||
|
using MongoDbGenericRepository;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using System;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace IntegrationTests.Infrastructure
|
namespace IntegrationTests.Infrastructure
|
||||||
{
|
{
|
||||||
@@ -18,5 +23,20 @@ namespace IntegrationTests.Infrastructure
|
|||||||
{
|
{
|
||||||
MongoDbContext.DropCollection<TDocument>(partitionKey);
|
MongoDbContext.DropCollection<TDocument>(partitionKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the max of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task<TDocument> GetByMaxAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByDescending)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : System.IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return await GetCollection<TDocument, TKey>().Find(Builders<TDocument>.Filter.Where(filter))
|
||||||
|
.SortByDescending(orderByDescending)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,62 +31,51 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="DnsClient, Version=1.0.7.0, Culture=neutral, PublicKeyToken=4574bb5573c51424, processorArchitecture=MSIL">
|
<Reference Include="DnsClient, Version=1.0.7.0, Culture=neutral, PublicKeyToken=4574bb5573c51424, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\MongoDbGenericRepository.1.3.4\lib\net45\DnsClient.dll</HintPath>
|
<HintPath>..\packages\MongoDbGenericRepository.1.3.8\lib\net45\DnsClient.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="MongoDB.Bson, Version=2.5.0.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="MongoDB.Bson, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\MongoDbGenericRepository.1.3.4\lib\net45\MongoDB.Bson.dll</HintPath>
|
<HintPath>..\packages\MongoDbGenericRepository.1.3.8\lib\net45\MongoDB.Bson.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="MongoDB.Driver, Version=2.5.0.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="MongoDB.Driver, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\MongoDbGenericRepository.1.3.4\lib\net45\MongoDB.Driver.dll</HintPath>
|
<HintPath>..\packages\MongoDbGenericRepository.1.3.8\lib\net45\MongoDB.Driver.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="MongoDB.Driver.Core, Version=2.5.0.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="MongoDB.Driver.Core, Version=2.7.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\MongoDbGenericRepository.1.3.4\lib\net45\MongoDB.Driver.Core.dll</HintPath>
|
<HintPath>..\packages\MongoDbGenericRepository.1.3.8\lib\net45\MongoDB.Driver.Core.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="MongoDbGenericRepository, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
<Reference Include="MongoDbGenericRepository, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\MongoDbGenericRepository.1.3.4\lib\net45\MongoDbGenericRepository.dll</HintPath>
|
<HintPath>..\packages\MongoDbGenericRepository.1.3.8\lib\net45\MongoDbGenericRepository.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="nunit.framework, Version=3.9.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
<Reference Include="nunit.framework, Version=3.9.0.0, Culture=neutral, PublicKeyToken=2638cd05610744eb, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll</HintPath>
|
<HintPath>..\packages\NUnit.3.9.0\lib\net45\nunit.framework.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
<Reference Include="System.Buffers, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
<Reference Include="System.Buffers, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\MongoDbGenericRepository.1.3.4\lib\net45\System.Buffers.dll</HintPath>
|
<HintPath>..\packages\MongoDbGenericRepository.1.3.8\lib\net45\System.Buffers.dll</HintPath>
|
||||||
</Reference>
|
</Reference>
|
||||||
<Reference Include="System.Configuration" />
|
<Reference Include="System.Configuration" />
|
||||||
<Reference Include="System.Core" />
|
<Reference Include="System.Core" />
|
||||||
<Reference Include="Microsoft.CSharp" />
|
<Reference Include="Microsoft.CSharp" />
|
||||||
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
<HintPath>..\packages\MongoDbGenericRepository.1.3.4\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
|
<HintPath>..\packages\MongoDbGenericRepository.1.3.8\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
|
||||||
<Private>True</Private>
|
|
||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="CreateTKeyPartitionedTests.cs" />
|
<Compile Include="CRUDObjectIdTests.cs" />
|
||||||
<Compile Include="CreateTKeyTests.cs" />
|
<Compile Include="CRUDPartitionedTests.cs" />
|
||||||
<Compile Include="DeletePartitionedTKeyTests.cs" />
|
<Compile Include="CRUDTKeyPartitionedCollectionNameAttributeTests.cs" />
|
||||||
<Compile Include="DeletePartitionedTests.cs" />
|
<Compile Include="CRUDTests.cs" />
|
||||||
<Compile Include="DeleteTKeyTests.cs" />
|
<Compile Include="CRUDPartitionedCollectionNameAttributeTests.cs" />
|
||||||
<Compile Include="DeleteTests.cs" />
|
<Compile Include="CRUDTKeyPartitionedTests.cs" />
|
||||||
<Compile Include="GroupTests\GroupingTests.cs" />
|
<Compile Include="CRUDTKeyTests.cs" />
|
||||||
<Compile Include="Infrastructure\BaseMongoDbRepositoryTests.cs" />
|
<Compile Include="Infrastructure\BaseMongoDbRepositoryTests.cs" />
|
||||||
<Compile Include="CreatePartitionedTests.cs" />
|
<Compile Include="Infrastructure\GlobalVariables.cs" />
|
||||||
<Compile Include="Infrastructure\Child.cs" />
|
|
||||||
<Compile Include="Infrastructure\ITestRepository.cs" />
|
<Compile Include="Infrastructure\ITestRepository.cs" />
|
||||||
|
<Compile Include="Infrastructure\MongoDbDocumentTestBase.cs" />
|
||||||
|
<Compile Include="Infrastructure\MongoDbTKeyDocumentTestBase.cs" />
|
||||||
|
<Compile Include="Infrastructure\RandomExtensions.cs" />
|
||||||
|
<Compile Include="Infrastructure\TestClasses.cs" />
|
||||||
<Compile Include="Infrastructure\TestRepository.cs" />
|
<Compile Include="Infrastructure\TestRepository.cs" />
|
||||||
<Compile Include="CreateTests.cs" />
|
|
||||||
<Compile Include="ProjectPartitionedTKeyTests.cs" />
|
|
||||||
<Compile Include="ProjectPartitionedTests.cs" />
|
|
||||||
<Compile Include="ProjectTKeyTests.cs" />
|
|
||||||
<Compile Include="ProjectTests.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
<Compile Include="ReadPartitionedTKeyTests.cs" />
|
|
||||||
<Compile Include="ReadPartitionedTests.cs" />
|
|
||||||
<Compile Include="ReadTKeyTests.cs" />
|
|
||||||
<Compile Include="ReadTests.cs" />
|
|
||||||
<Compile Include="UpdatePartitionedTKeyTests.cs" />
|
|
||||||
<Compile Include="UpdatePartitionedTests.cs" />
|
|
||||||
<Compile Include="UpdateTKeyTests.cs" />
|
|
||||||
<Compile Include="UpdateTests.cs" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="App.config">
|
<None Include="App.config">
|
||||||
|
|||||||
@@ -1,143 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDB.Bson.Serialization.Attributes;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
|
|
||||||
public class ProjectTestsPartitionedTKeyDocument : IDocument<Guid>, IPartitionedDocument
|
|
||||||
{
|
|
||||||
[BsonId]
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Version { get; set; }
|
|
||||||
public ProjectTestsPartitionedTKeyDocument()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid();
|
|
||||||
Version = 2;
|
|
||||||
PartitionKey = "TestPartitionKey";
|
|
||||||
Nested = new NestedTKey();
|
|
||||||
}
|
|
||||||
public string PartitionKey { get; set; }
|
|
||||||
public NestedTKey Nested { get; set; }
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProjectPartitionedTKeyTests : BaseMongoDbRepositoryTests<ProjectTestsPartitionedTKeyDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedProjectOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectOneAsyncContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
document.SomeContent = someContent;
|
|
||||||
document.Nested.SomeDate = someDate;
|
|
||||||
SUT.AddOne<ProjectTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.ProjectOneAsync<ProjectTestsPartitionedTKeyDocument, MyProjection, Guid>(
|
|
||||||
x => x.Id == document.Id,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
},
|
|
||||||
PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
Assert.AreEqual(someContent, result.SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedProjectOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectOneContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
document.SomeContent = someContent;
|
|
||||||
document.Nested.SomeDate = someDate;
|
|
||||||
SUT.AddOne<ProjectTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.ProjectOne<ProjectTestsPartitionedTKeyDocument, MyProjection, Guid>(
|
|
||||||
x => x.Id == document.Id,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
},
|
|
||||||
PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
Assert.AreEqual(someContent, result.SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedProjectManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectManyAsyncContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocuments(5);
|
|
||||||
document.ForEach(e =>
|
|
||||||
{
|
|
||||||
e.SomeContent = someContent;
|
|
||||||
e.Nested.SomeDate = someDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
SUT.AddMany<ProjectTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.ProjectManyAsync<ProjectTestsPartitionedTKeyDocument, MyProjection, Guid>(
|
|
||||||
x => x.SomeContent == someContent,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
},
|
|
||||||
PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
Assert.AreEqual(someContent, result.First().SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.First().SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.First().SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedProjectMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectManyContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocuments(5);
|
|
||||||
document.ForEach(e =>
|
|
||||||
{
|
|
||||||
e.SomeContent = someContent;
|
|
||||||
e.Nested.SomeDate = someDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
SUT.AddMany<ProjectTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.ProjectMany<ProjectTestsPartitionedTKeyDocument, MyProjection, Guid>(
|
|
||||||
x => x.SomeContent == someContent,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
},
|
|
||||||
PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
Assert.AreEqual(someContent, result.First().SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.First().SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.First().SomeDate.Second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,140 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class ProjectTestsPartitionedDocument : PartitionedDocument
|
|
||||||
{
|
|
||||||
public ProjectTestsPartitionedDocument() : base("TestPartitionKey")
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
Nested = new Nested
|
|
||||||
{
|
|
||||||
SomeDate = DateTime.UtcNow
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
|
|
||||||
public Nested Nested { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProjectPartitionedTests : BaseMongoDbRepositoryTests<ProjectTestsPartitionedDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedProjectOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectOneAsyncContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
document.SomeContent = someContent;
|
|
||||||
document.Nested.SomeDate = someDate;
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.ProjectOneAsync<ProjectTestsPartitionedDocument, MyProjection>(
|
|
||||||
x => x.Id == document.Id,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
},
|
|
||||||
PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
Assert.AreEqual(someContent, result.SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedProjectOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectOneContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
document.SomeContent = someContent;
|
|
||||||
document.Nested.SomeDate = someDate;
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.ProjectOne<ProjectTestsPartitionedDocument, MyProjection>(
|
|
||||||
x => x.Id == document.Id,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
},
|
|
||||||
PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
Assert.AreEqual(someContent, result.SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedProjectManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectManyAsyncContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocuments(5);
|
|
||||||
document.ForEach(e =>
|
|
||||||
{
|
|
||||||
e.SomeContent = someContent;
|
|
||||||
e.Nested.SomeDate = someDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
SUT.AddMany(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.ProjectManyAsync<ProjectTestsPartitionedDocument, MyProjection>(
|
|
||||||
x => x.SomeContent == someContent,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
},
|
|
||||||
PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
Assert.AreEqual(someContent, result.First().SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.First().SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.First().SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedProjectMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectManyContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocuments(5);
|
|
||||||
document.ForEach(e =>
|
|
||||||
{
|
|
||||||
e.SomeContent = someContent;
|
|
||||||
e.Nested.SomeDate = someDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
SUT.AddMany(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.ProjectMany<ProjectTestsPartitionedDocument, MyProjection>(
|
|
||||||
x => x.SomeContent == someContent,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
},
|
|
||||||
PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
Assert.AreEqual(someContent, result.First().SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.First().SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.First().SomeDate.Second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,150 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDB.Bson.Serialization.Attributes;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class NestedTKey
|
|
||||||
{
|
|
||||||
public DateTime SomeDate { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MyProjectionTKey
|
|
||||||
{
|
|
||||||
public DateTime SomeDate { get; set; }
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProjectTestsTKeyDocument : IDocument<Guid>
|
|
||||||
{
|
|
||||||
[BsonId]
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Version { get; set; }
|
|
||||||
public ProjectTestsTKeyDocument()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid();
|
|
||||||
Version = 2;
|
|
||||||
Nested = new NestedTKey
|
|
||||||
{
|
|
||||||
SomeDate = DateTime.UtcNow
|
|
||||||
};
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
public NestedTKey Nested { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProjectTKeyTests : BaseMongoDbRepositoryTests<ProjectTestsTKeyDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public async Task ProjectOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectOneAsyncContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
document.SomeContent = someContent;
|
|
||||||
document.Nested.SomeDate = someDate;
|
|
||||||
SUT.AddOne<ProjectTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.ProjectOneAsync<ProjectTestsTKeyDocument, MyProjection, Guid>(
|
|
||||||
x => x.Id == document.Id,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
});
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
Assert.AreEqual(someContent, result.SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void ProjectOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectOneContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
document.SomeContent = someContent;
|
|
||||||
document.Nested.SomeDate = someDate;
|
|
||||||
SUT.AddOne<ProjectTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.ProjectOne<ProjectTestsTKeyDocument, MyProjection, Guid>(
|
|
||||||
x => x.Id == document.Id,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
});
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
Assert.AreEqual(someContent, result.SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task ProjectManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectManyAsyncContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocuments(5);
|
|
||||||
document.ForEach(e =>
|
|
||||||
{
|
|
||||||
e.SomeContent = someContent;
|
|
||||||
e.Nested.SomeDate = someDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
SUT.AddMany<ProjectTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.ProjectManyAsync<ProjectTestsTKeyDocument, MyProjection, Guid>(
|
|
||||||
x => x.SomeContent == someContent,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
});
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
Assert.AreEqual(someContent, result.First().SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.First().SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.First().SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void ProjectMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectManyContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocuments(5);
|
|
||||||
document.ForEach(e =>
|
|
||||||
{
|
|
||||||
e.SomeContent = someContent;
|
|
||||||
e.Nested.SomeDate = someDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
SUT.AddMany<ProjectTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.ProjectMany<ProjectTestsTKeyDocument, MyProjection, Guid>(
|
|
||||||
x => x.SomeContent == someContent,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
});
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
Assert.AreEqual(someContent, result.First().SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.First().SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.First().SomeDate.Second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,149 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class Nested
|
|
||||||
{
|
|
||||||
public DateTime SomeDate { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MyProjection
|
|
||||||
{
|
|
||||||
public DateTime SomeDate { get; set; }
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProjectTestsDocument : Document
|
|
||||||
{
|
|
||||||
public ProjectTestsDocument()
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
Nested = new Nested
|
|
||||||
{
|
|
||||||
SomeDate = DateTime.UtcNow
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
|
|
||||||
public Nested Nested { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ProjectTests : BaseMongoDbRepositoryTests<ProjectTestsDocument>
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task ProjectOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectOneAsyncContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
document.SomeContent = someContent;
|
|
||||||
document.Nested.SomeDate = someDate;
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.ProjectOneAsync<ProjectTestsDocument, MyProjection>(
|
|
||||||
x => x.Id == document.Id,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
});
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
Assert.AreEqual(someContent, result.SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void ProjectOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectOneContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
document.SomeContent = someContent;
|
|
||||||
document.Nested.SomeDate = someDate;
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.ProjectOne<ProjectTestsDocument, MyProjection>(
|
|
||||||
x => x.Id == document.Id,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
});
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
Assert.AreEqual(someContent, result.SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task ProjectManyAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectManyAsyncContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocuments(5);
|
|
||||||
document.ForEach(e =>
|
|
||||||
{
|
|
||||||
e.SomeContent = someContent;
|
|
||||||
e.Nested.SomeDate = someDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
SUT.AddMany(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.ProjectManyAsync<ProjectTestsDocument, MyProjection>(
|
|
||||||
x => x.SomeContent == someContent,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
});
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
Assert.AreEqual(someContent, result.First().SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.First().SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.First().SomeDate.Second);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void ProjectMany()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
const string someContent = "ProjectManyContent";
|
|
||||||
var someDate = DateTime.UtcNow;
|
|
||||||
var document = CreateTestDocuments(5);
|
|
||||||
document.ForEach(e =>
|
|
||||||
{
|
|
||||||
e.SomeContent = someContent;
|
|
||||||
e.Nested.SomeDate = someDate;
|
|
||||||
});
|
|
||||||
|
|
||||||
SUT.AddMany(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.ProjectMany<ProjectTestsDocument, MyProjection>(
|
|
||||||
x => x.SomeContent == someContent,
|
|
||||||
x => new MyProjection
|
|
||||||
{
|
|
||||||
SomeContent = x.SomeContent,
|
|
||||||
SomeDate = x.Nested.SomeDate
|
|
||||||
});
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
Assert.AreEqual(someContent, result.First().SomeContent);
|
|
||||||
Assert.AreEqual(someDate.Minute, result.First().SomeDate.Minute);
|
|
||||||
Assert.AreEqual(someDate.Second, result.First().SomeDate.Second);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,189 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDB.Bson.Serialization.Attributes;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class ReadTestsPartitionedTKeyDocument : IDocument<Guid>, IPartitionedDocument
|
|
||||||
{
|
|
||||||
[BsonId]
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Version { get; set; }
|
|
||||||
public ReadTestsPartitionedTKeyDocument()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid();
|
|
||||||
Version = 2;
|
|
||||||
PartitionKey = "TestPartitionKey";
|
|
||||||
}
|
|
||||||
public string PartitionKey { get; set; }
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestFixture]
|
|
||||||
public class ReadPartitionedTKeyTests : BaseMongoDbRepositoryTests<ReadTestsPartitionedTKeyDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedGetByIdAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetByIdAsync<ReadTestsPartitionedTKeyDocument, Guid>(document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedGetById()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetById<ReadTestsPartitionedTKeyDocument, Guid>(document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedGetOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetOneAsync<ReadTestsPartitionedTKeyDocument, Guid>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedGetOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetOne<ReadTestsPartitionedTKeyDocument, Guid>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedGetCursor()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var cursor = SUT.GetCursor<ReadTestsPartitionedTKeyDocument, Guid>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
var count = cursor.Count();
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedAnyAsyncReturnsTrue()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.AnyAsync<ReadTestsPartitionedTKeyDocument, Guid>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(true, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedAnyAsyncReturnsFalse()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.AnyAsync<ReadTestsPartitionedTKeyDocument, Guid>(x => x.Id == Guid.NewGuid(), PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(false, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedAnyReturnsTrue()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Any<ReadTestsPartitionedTKeyDocument, Guid>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(true, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedAnyReturnsFalse()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Any<ReadTestsPartitionedTKeyDocument, Guid>(x => x.Id == Guid.NewGuid(), PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(false, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedGetAllAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "GetAllAsyncContent");
|
|
||||||
SUT.AddMany<ReadTestsPartitionedTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetAllAsync<ReadTestsPartitionedTKeyDocument, Guid>(x => x.SomeContent == "GetAllAsyncContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedGetAll()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "GetAllContent");
|
|
||||||
SUT.AddMany<ReadTestsPartitionedTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetAll<ReadTestsPartitionedTKeyDocument, Guid>(x => x.SomeContent == "GetAllContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedCountAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "CountAsyncContent");
|
|
||||||
SUT.AddMany<ReadTestsPartitionedTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.CountAsync<ReadTestsPartitionedTKeyDocument, Guid>(x => x.SomeContent == "CountAsyncContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedCount()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "CountContent");
|
|
||||||
SUT.AddMany<ReadTestsPartitionedTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Count<ReadTestsPartitionedTKeyDocument, Guid>(x => x.SomeContent == "CountContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,181 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class ReadTestsPartitionedDocument : PartitionedDocument
|
|
||||||
{
|
|
||||||
public ReadTestsPartitionedDocument() : base("TestPartitionKey")
|
|
||||||
{
|
|
||||||
Version = 1;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class ReadPartitionedTests : BaseMongoDbRepositoryTests<ReadTestsPartitionedDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedGetByIdAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetByIdAsync<ReadTestsPartitionedDocument>(document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedGetById()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetById<ReadTestsPartitionedDocument>(document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedGetOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetOneAsync<ReadTestsPartitionedDocument>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedGetOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetOne<ReadTestsPartitionedDocument>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedGetCursor()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var cursor = SUT.GetCursor<ReadTestsPartitionedDocument>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
var count = cursor.Count();
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedAnyAsyncReturnsTrue()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.AnyAsync<ReadTestsPartitionedDocument>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(true, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedAnyAsyncReturnsFalse()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.AnyAsync<ReadTestsPartitionedDocument>(x => x.Id == Guid.NewGuid(), PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(false, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedAnyReturnsTrue()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Any<ReadTestsPartitionedDocument>(x => x.Id == document.Id, PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(true, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedAnyReturnsFalse()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Any<ReadTestsPartitionedDocument>(x => x.Id == Guid.NewGuid(), PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(false, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedGetAllAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "GetAllAsyncContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetAllAsync<ReadTestsPartitionedDocument>(x => x.SomeContent == "GetAllAsyncContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedGetAll()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "GetAllContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetAll<ReadTestsPartitionedDocument>(x => x.SomeContent == "GetAllContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedCountAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "CountAsyncContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.CountAsync<ReadTestsPartitionedDocument>(x => x.SomeContent == "CountAsyncContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void PartitionedCount()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "CountContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Count<ReadTestsPartitionedDocument>(x => x.SomeContent == "CountContent", PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,187 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDB.Bson.Serialization.Attributes;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class ReadTestsTKeyDocument : IDocument<Guid>
|
|
||||||
{
|
|
||||||
[BsonId]
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Version { get; set; }
|
|
||||||
public ReadTestsTKeyDocument()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid();
|
|
||||||
Version = 2;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestFixture]
|
|
||||||
public class ReadTKeyTests : BaseMongoDbRepositoryTests<ReadTestsTKeyDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public async Task GetByIdAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetByIdAsync<ReadTestsTKeyDocument, Guid>(document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void GetById()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetById<ReadTestsTKeyDocument, Guid>(document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task GetOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetOneAsync<ReadTestsTKeyDocument, Guid>(x => x.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void GetOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetOne<ReadTestsTKeyDocument, Guid>(x => x.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void GetCursor()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var cursor = SUT.GetCursor<ReadTestsTKeyDocument, Guid>(x => x.Id == document.Id);
|
|
||||||
var count = cursor.Count();
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task AnyAsyncReturnsTrue()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.AnyAsync<ReadTestsTKeyDocument, Guid>(x => x.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(true, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task AnyAsyncReturnsFalse()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.AnyAsync<ReadTestsTKeyDocument, Guid>(x => x.Id == Guid.NewGuid());
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(false, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void AnyReturnsTrue()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Any<ReadTestsTKeyDocument, Guid>(x => x.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(true, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void AnyReturnsFalse()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<ReadTestsTKeyDocument, Guid>(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Any<ReadTestsTKeyDocument, Guid>(x => x.Id == Guid.NewGuid());
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(false, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task GetAllAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "GetAllAsyncContent");
|
|
||||||
SUT.AddMany<ReadTestsTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetAllAsync<ReadTestsTKeyDocument, Guid>(x => x.SomeContent == "GetAllAsyncContent");
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void GetAll()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "GetAllContent");
|
|
||||||
SUT.AddMany<ReadTestsTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetAll<ReadTestsTKeyDocument, Guid>(x => x.SomeContent == "GetAllContent");
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task CountAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "CountAsyncContent");
|
|
||||||
SUT.AddMany<ReadTestsTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.CountAsync<ReadTestsTKeyDocument, Guid>(x => x.SomeContent == "CountAsyncContent");
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Count()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "CountContent");
|
|
||||||
SUT.AddMany<ReadTestsTKeyDocument, Guid>(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Count<ReadTestsTKeyDocument, Guid>(x => x.SomeContent == "CountContent");
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,182 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class ReadTestsDocument : Document
|
|
||||||
{
|
|
||||||
public ReadTestsDocument()
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestFixture]
|
|
||||||
public class ReadTests : BaseMongoDbRepositoryTests<ReadTestsDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public async Task GetByIdAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetByIdAsync<ReadTestsDocument>(document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void GetById()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetById<ReadTestsDocument>(document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task GetOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetOneAsync<ReadTestsDocument>(x => x.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void GetOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetOne<ReadTestsDocument>(x => x.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.IsNotNull(result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void GetCursor()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var cursor = SUT.GetCursor<ReadTestsDocument>(x => x.Id == document.Id);
|
|
||||||
var count = cursor.Count();
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(1, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task AnyAsyncReturnsTrue()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.AnyAsync<ReadTestsDocument>(x => x.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(true, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task AnyAsyncReturnsFalse()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.AnyAsync<ReadTestsDocument>(x => x.Id == Guid.NewGuid());
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(false, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void AnyReturnsTrue()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Any<ReadTestsDocument>(x => x.Id == document.Id);
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(true, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void AnyReturnsFalse()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Any<ReadTestsDocument>(x => x.Id == Guid.NewGuid());
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(false, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task GetAllAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "GetAllAsyncContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.GetAllAsync<ReadTestsDocument>(x => x.SomeContent == "GetAllAsyncContent");
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void GetAll()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "GetAllContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.GetAll<ReadTestsDocument>(x => x.SomeContent == "GetAllContent");
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result.Count);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task CountAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "CountAsyncContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.CountAsync<ReadTestsDocument>(x => x.SomeContent == "CountAsyncContent");
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void Count()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var documents = CreateTestDocuments(5);
|
|
||||||
documents.ForEach(e => e.SomeContent = "CountContent");
|
|
||||||
SUT.AddMany(documents);
|
|
||||||
// Act
|
|
||||||
var result = SUT.Count<ReadTestsDocument>(x => x.SomeContent == "CountContent");
|
|
||||||
// Assert
|
|
||||||
Assert.AreEqual(5, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,117 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDB.Bson.Serialization.Attributes;
|
|
||||||
using MongoDB.Driver;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
|
|
||||||
public class UpdateTestsPartitionedTKeyDocument : IDocument<Guid>, IPartitionedDocument
|
|
||||||
{
|
|
||||||
[BsonId]
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Version { get; set; }
|
|
||||||
public UpdateTestsPartitionedTKeyDocument()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid();
|
|
||||||
Version = 2;
|
|
||||||
PartitionKey = "TestPartitionKey";
|
|
||||||
Children = new List<Child>();
|
|
||||||
}
|
|
||||||
public string PartitionKey { get; set; }
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
public List<Child> Children { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestFixture]
|
|
||||||
public class UpdatePartitionedTKeyTests : BaseMongoDbRepositoryTests<UpdateTestsPartitionedTKeyDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void PartitionedUpdateOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
document.SomeContent = "UpdateOneContent";
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne<UpdateTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedTKeyDocument, Guid>(document.Id, PartitionKey);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual("UpdateOneContent", updatedDocument.SomeContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedUpdateOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
document.SomeContent = "UpdateOneAsyncContent";
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync<UpdateTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedTKeyDocument, Guid>(document.Id, PartitionKey);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual("UpdateOneAsyncContent", updatedDocument.SomeContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task UpdateOneAsyncWithUpdateDefinition()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
var updateDef = Builders<UpdateTestsPartitionedTKeyDocument>.Update.AddToSetEach(p => p.Children, childrenToAdd);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync<UpdateTestsPartitionedTKeyDocument, Guid>(document, updateDef);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedTKeyDocument, Guid>(document.Id, document.PartitionKey);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void UpdateOneWithUpdateDefinition()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsPartitionedTKeyDocument, Guid>(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
var updateDef = Builders<UpdateTestsPartitionedTKeyDocument>.Update.AddToSetEach(p => p.Children, childrenToAdd);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne<UpdateTestsPartitionedTKeyDocument, Guid>(document, updateDef);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedTKeyDocument, Guid>(document.Id, document.PartitionKey);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,205 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDB.Driver;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class UpdateTestsPartitionedDocument : PartitionedDocument
|
|
||||||
{
|
|
||||||
public UpdateTestsPartitionedDocument() : base("TestPartitionKey")
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
Children = new List<Child>();
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
public List<Child> Children { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class UpdatePartitionedTests : BaseMongoDbRepositoryTests<UpdateTestsPartitionedDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void PartitionedUpdateOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
document.SomeContent = "UpdateOneContent";
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne(document);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedDocument>(document.Id, PartitionKey);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual("UpdateOneContent", updatedDocument.SomeContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task PartitionedUpdateOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
document.SomeContent = "UpdateOneAsyncContent";
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync(document);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedDocument>(document.Id, PartitionKey);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual("UpdateOneAsyncContent", updatedDocument.SomeContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task UpdateOneAsyncWithUpdateDefinition()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsPartitionedDocument>(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
var updateDef = Builders<UpdateTestsPartitionedDocument>.Update.AddToSetEach(p => p.Children, childrenToAdd);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync<UpdateTestsPartitionedDocument>(document, updateDef);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedDocument>(document.Id, document.PartitionKey);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void UpdateOneWithUpdateDefinition()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsPartitionedDocument>(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
var updateDef = Builders<UpdateTestsPartitionedDocument>.Update.AddToSetEach(p => p.Children, childrenToAdd);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne<UpdateTestsPartitionedDocument>(document, updateDef);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedDocument>(document.Id, document.PartitionKey);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void UpdateOneWithFieldSelector()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne(document, x => x.Children, childrenToAdd);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedDocument>(document.Id, document.PartitionKey);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task UpdateOneAsyncWithFieldSelector()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync(document, x => x.Children, childrenToAdd);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedDocument>(document.Id, document.PartitionKey);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void UpdateOneWithFilterAndFieldSelector()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var filter = Builders<UpdateTestsPartitionedDocument>.Filter.Eq("Id", document.Id);
|
|
||||||
var result = SUT.UpdateOne(filter, x => x.Children, childrenToAdd, document.PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedDocument>(document.Id, document.PartitionKey);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task UpdateOneAsyncWithFilterAndFieldSelector()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var filter = Builders<UpdateTestsPartitionedDocument>.Filter.Eq("Id", document.Id);
|
|
||||||
var result = await SUT.UpdateOneAsync(filter, x => x.Children, childrenToAdd, document.PartitionKey);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsPartitionedDocument>(document.Id, document.PartitionKey);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDB.Bson.Serialization.Attributes;
|
|
||||||
using MongoDB.Driver;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
|
|
||||||
public class UpdateTestsTKeyDocument : IDocument<Guid>
|
|
||||||
{
|
|
||||||
[BsonId]
|
|
||||||
public Guid Id { get; set; }
|
|
||||||
public int Version { get; set; }
|
|
||||||
public UpdateTestsTKeyDocument()
|
|
||||||
{
|
|
||||||
Id = Guid.NewGuid();
|
|
||||||
Version = 2;
|
|
||||||
Children = new List<Child>();
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
public List<Child> Children { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
[TestFixture]
|
|
||||||
public class UpdateTKeyTests : BaseMongoDbRepositoryTests<UpdateTestsTKeyDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void UpdateOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsTKeyDocument, Guid>(document);
|
|
||||||
document.SomeContent = "UpdateOneContent";
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne<UpdateTestsTKeyDocument, Guid>(document);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsTKeyDocument, Guid>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual("UpdateOneContent", updatedDocument.SomeContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task UpdateOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsTKeyDocument, Guid>(document);
|
|
||||||
document.SomeContent = "UpdateOneAsyncContent";
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync<UpdateTestsTKeyDocument, Guid>(document);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsTKeyDocument, Guid>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual("UpdateOneAsyncContent", updatedDocument.SomeContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task UpdateOneAsyncWithUpdateDefinition()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsTKeyDocument, Guid>(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
var updateDef = Builders<UpdateTestsTKeyDocument>.Update.AddToSetEach(p => p.Children, childrenToAdd);
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync<UpdateTestsTKeyDocument, Guid>(document, updateDef);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsTKeyDocument, Guid>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void UpdateOneWithUpdateDefinition()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsTKeyDocument, Guid>(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
var updateDef = Builders<UpdateTestsTKeyDocument>.Update.AddToSetEach(p => p.Children, childrenToAdd);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne<UpdateTestsTKeyDocument, Guid>(document, updateDef);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsTKeyDocument, Guid>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void UpdateOneWithFieldSelector()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsTKeyDocument, Guid>(document);
|
|
||||||
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
var filter = Builders<UpdateTestsTKeyDocument>.Filter.Eq("Id", document.Id);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne<UpdateTestsTKeyDocument, Guid, List<Child>>(document, x => x.Children, childrenToAdd);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsTKeyDocument, Guid>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task UpdateOneAsyncWithFieldSelector()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsTKeyDocument, Guid>(document);
|
|
||||||
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
var filter = Builders<UpdateTestsTKeyDocument>.Filter.Eq("Id", document.Id);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync<UpdateTestsTKeyDocument, Guid, List<Child>>(document, x => x.Children, childrenToAdd);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsTKeyDocument, Guid>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void UpdateOneWithFilterAndFieldSelector()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne<UpdateTestsTKeyDocument, Guid>(document);
|
|
||||||
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
var filter = Builders<UpdateTestsTKeyDocument>.Filter.Eq("Id", document.Id);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne<UpdateTestsTKeyDocument, Guid, List<Child>>(filter, x => x.Children, childrenToAdd);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsTKeyDocument, Guid>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,205 +0,0 @@
|
|||||||
using IntegrationTests.Infrastructure;
|
|
||||||
using MongoDB.Driver;
|
|
||||||
using MongoDbGenericRepository.Models;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace IntegrationTests
|
|
||||||
{
|
|
||||||
public class UpdateTestsDocument : Document
|
|
||||||
{
|
|
||||||
public UpdateTestsDocument()
|
|
||||||
{
|
|
||||||
Version = 2;
|
|
||||||
Children = new List<Child>();
|
|
||||||
}
|
|
||||||
public string SomeContent { get; set; }
|
|
||||||
public List<Child> Children { get; set; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public class UpdateTests : BaseMongoDbRepositoryTests<UpdateTestsDocument>
|
|
||||||
{
|
|
||||||
[Test]
|
|
||||||
public void UpdateOne()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
document.SomeContent = "UpdateOneContent";
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne(document);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsDocument>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual("UpdateOneContent", updatedDocument.SomeContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task UpdateOneAsync()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
document.SomeContent = "UpdateOneAsyncContent";
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync(document);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsDocument>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual("UpdateOneAsyncContent", updatedDocument.SomeContent);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task UpdateOneAsyncWithUpdateDefinition()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
var updateDef = Builders<UpdateTestsDocument>.Update.AddToSetEach(p => p.Children, childrenToAdd);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync(document, updateDef);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsDocument>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void UpdateOneWithUpdateDefinition()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
var updateDef = Builders<UpdateTestsDocument>.Update.AddToSetEach(p => p.Children, childrenToAdd);
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne(document, updateDef);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsDocument>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void UpdateOneWithFieldSelector()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = SUT.UpdateOne(document, x => x.Children, childrenToAdd);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsDocument>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task UpdateOneAsyncWithFieldSelector()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var result = await SUT.UpdateOneAsync(document, x => x.Children, childrenToAdd);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsDocument>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public void UpdateOneWithFilterAndFieldSelector()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var filter = Builders<UpdateTestsDocument>.Filter.Eq("Id", document.Id);
|
|
||||||
var result = SUT.UpdateOne(filter, x => x.Children, childrenToAdd);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsDocument>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
public async Task UpdateOneAsyncWithFilterAndFieldSelector()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var document = CreateTestDocument();
|
|
||||||
SUT.AddOne(document);
|
|
||||||
var childrenToAdd = new List<Child>
|
|
||||||
{
|
|
||||||
new Child("testType1", "testValue1"),
|
|
||||||
new Child("testType2", "testValue2")
|
|
||||||
};
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var filter = Builders<UpdateTestsDocument>.Filter.Eq("Id", document.Id);
|
|
||||||
var result = await SUT.UpdateOneAsync(filter, x => x.Children, childrenToAdd);
|
|
||||||
// Assert
|
|
||||||
Assert.IsTrue(result);
|
|
||||||
var updatedDocument = SUT.GetById<UpdateTestsDocument>(document.Id);
|
|
||||||
Assert.IsNotNull(updatedDocument);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Type, updatedDocument.Children[0].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[0].Value, updatedDocument.Children[0].Value);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Type, updatedDocument.Children[1].Type);
|
|
||||||
Assert.AreEqual(childrenToAdd[1].Value, updatedDocument.Children[1].Value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<packages>
|
<packages>
|
||||||
<package id="DnsClient" version="1.0.7" targetFramework="net461" />
|
<package id="DnsClient" version="1.0.7" targetFramework="net461" />
|
||||||
<package id="MongoDB.Bson" version="2.5.0" targetFramework="net461" />
|
<package id="MongoDB.Bson" version="2.7.0" targetFramework="net461" />
|
||||||
<package id="MongoDB.Driver" version="2.5.0" targetFramework="net461" />
|
<package id="MongoDB.Driver" version="2.7.0" targetFramework="net461" />
|
||||||
<package id="MongoDB.Driver.Core" version="2.5.0" targetFramework="net461" />
|
<package id="MongoDB.Driver.Core" version="2.7.0" targetFramework="net461" />
|
||||||
<package id="MongoDbGenericRepository" version="1.3.4" targetFramework="net461" />
|
<package id="MongoDbGenericRepository" version="1.3.8" targetFramework="net461" />
|
||||||
<package id="NUnit" version="3.9.0" targetFramework="net461" />
|
<package id="NUnit" version="3.9.0" targetFramework="net461" />
|
||||||
<package id="NUnit.ConsoleRunner" version="3.7.0" targetFramework="net461" />
|
<package id="NUnit.ConsoleRunner" version="3.7.0" targetFramework="net461" />
|
||||||
<package id="System.Buffers" version="4.3.0" targetFramework="net461" />
|
<package id="System.Buffers" version="4.3.0" targetFramework="net461" />
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2018 Alexandre SPIESER
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
+53
-1
@@ -12,7 +12,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// The IBaseMongoRepository exposes the CRUD functionality of the BaseMongoRepository.
|
/// The IBaseMongoRepository exposes the CRUD functionality of the BaseMongoRepository.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public interface IBaseMongoRepository : IReadOnlyMongoRepository
|
public interface IBaseMongoRepository : IReadOnlyMongoRepository, IMongoDbCollectionIndexRepository
|
||||||
{
|
{
|
||||||
#region Create
|
#region Create
|
||||||
|
|
||||||
@@ -159,6 +159,18 @@ namespace MongoDbGenericRepository
|
|||||||
Task<bool> UpdateOneAsync<TDocument, TField>(TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value)
|
Task<bool> UpdateOneAsync<TDocument, TField>(TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value)
|
||||||
where TDocument : IDocument;
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// For the entity selected by the filter, updates the property field with the given value.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TField">The type of the field.</typeparam>
|
||||||
|
/// <param name="filter">The document filter.</param>
|
||||||
|
/// <param name="field">The field selector.</param>
|
||||||
|
/// <param name="value">The new value of the property field.</param>
|
||||||
|
/// <param name="partitionKey">The partition key for the document.</param>
|
||||||
|
bool UpdateOne<TDocument, TField>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Takes a document you want to modify and applies the update you have defined in MongoDb.
|
/// Takes a document you want to modify and applies the update you have defined in MongoDb.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -168,6 +180,18 @@ namespace MongoDbGenericRepository
|
|||||||
Task<bool> UpdateOneAsync<TDocument>(TDocument documentToModify, UpdateDefinition<TDocument> update)
|
Task<bool> UpdateOneAsync<TDocument>(TDocument documentToModify, UpdateDefinition<TDocument> update)
|
||||||
where TDocument : IDocument;
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// For the entity selected by the filter, updates the property field with the given value.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TField">The type of the field.</typeparam>
|
||||||
|
/// <param name="filter">The document filter.</param>
|
||||||
|
/// <param name="field">The field selector.</param>
|
||||||
|
/// <param name="value">The new value of the property field.</param>
|
||||||
|
/// <param name="partitionKey">The partition key for the document.</param>
|
||||||
|
Task<bool> UpdateOneAsync<TDocument, TField>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Takes a document you want to modify and applies the update you have defined in MongoDb.
|
/// Takes a document you want to modify and applies the update you have defined in MongoDb.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -223,6 +247,20 @@ namespace MongoDbGenericRepository
|
|||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>;
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// For the entity selected by the filter, updates the property field with the given value..
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
|
/// <typeparam name="TField">The type of the field.</typeparam>
|
||||||
|
/// <param name="filter">The document filter.</param>
|
||||||
|
/// <param name="field">The field selector.</param>
|
||||||
|
/// <param name="value">The new value of the property field.</param>
|
||||||
|
/// <param name="partitionKey">The partition key for the document.</param>
|
||||||
|
bool UpdateOne<TDocument, TKey, TField>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates the property field with the given value update a property field in entities.
|
/// Updates the property field with the given value update a property field in entities.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -236,6 +274,20 @@ namespace MongoDbGenericRepository
|
|||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>;
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// For the entity selected by the filter, updates the property field with the given value.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
|
/// <typeparam name="TField">The type of the field.</typeparam>
|
||||||
|
/// <param name="filter">The document filter.</param>
|
||||||
|
/// <param name="field">The field selector.</param>
|
||||||
|
/// <param name="value">The new value of the property field.</param>
|
||||||
|
/// <param name="partitionKey">The partition key for the document.</param>
|
||||||
|
Task<bool> UpdateOneAsync<TDocument, TKey, TField>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates the property field with the given value update a property field in entities.
|
/// Updates the property field with the given value update a property field in entities.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -0,0 +1,193 @@
|
|||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace MongoDbGenericRepository
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The repository interface for managing indexes
|
||||||
|
/// </summary>
|
||||||
|
public interface IMongoDbCollectionIndexRepository
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Create a text index on the given field.
|
||||||
|
/// IndexCreationOptions can be supplied to further specify
|
||||||
|
/// how the creation should be done.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <param name="field">The field we want to index.</param>
|
||||||
|
/// <param name="indexCreationOptions">Options for creating an index.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
/// <returns>The result of the create index operation.</returns>
|
||||||
|
Task<string> CreateTextIndexAsync<TDocument>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create a text index on the given field.
|
||||||
|
/// IndexCreationOptions can be supplied to further specify
|
||||||
|
/// how the creation should be done.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
|
/// <param name="field">The field we want to index.</param>
|
||||||
|
/// <param name="indexCreationOptions">Options for creating an index.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
/// <returns>The result of the create index operation.</returns>
|
||||||
|
Task<string> CreateTextIndexAsync<TDocument, TKey>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates an index on the given field in ascending order.
|
||||||
|
/// IndexCreationOptions can be supplied to further specify
|
||||||
|
/// how the creation should be done.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <param name="field">The field we want to index.</param>
|
||||||
|
/// <param name="indexCreationOptions">Options for creating an index.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
/// <returns>The result of the create index operation.</returns>
|
||||||
|
Task<string> CreateAscendingIndexAsync<TDocument>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null) where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates an index on the given field in ascending order.
|
||||||
|
/// IndexCreationOptions can be supplied to further specify
|
||||||
|
/// how the creation should be done.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
|
/// <param name="field">The field we want to index.</param>
|
||||||
|
/// <param name="indexCreationOptions">Options for creating an index.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
/// <returns>The result of the create index operation.</returns>
|
||||||
|
Task<string> CreateAscendingIndexAsync<TDocument, TKey>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates an index on the given field in descending order.
|
||||||
|
/// IndexCreationOptions can be supplied to further specify
|
||||||
|
/// how the creation should be done.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <param name="field">The field we want to index.</param>
|
||||||
|
/// <param name="indexCreationOptions">Options for creating an index.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
/// <returns>A string containing the result of the operation.</returns>
|
||||||
|
Task<string> CreateDescendingIndexAsync<TDocument>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates an index on the given field in descending order.
|
||||||
|
/// IndexCreationOptions can be supplied to further specify
|
||||||
|
/// how the creation should be done.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
|
/// <param name="field">The field we want to index.</param>
|
||||||
|
/// <param name="indexCreationOptions">Options for creating an index.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
/// <returns>The result of the create index operation.</returns>
|
||||||
|
Task<string> CreateDescendingIndexAsync<TDocument, TKey>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a hashed index on the given field.
|
||||||
|
/// IndexCreationOptions can be supplied to further specify
|
||||||
|
/// how the creation should be done.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <param name="field">The field we want to index.</param>
|
||||||
|
/// <param name="indexCreationOptions">Options for creating an index.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
/// <returns>A string containing the result of the operation.</returns>
|
||||||
|
Task<string> CreateHashedIndexAsync<TDocument>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a hashed index on the given field.
|
||||||
|
/// IndexCreationOptions can be supplied to further specify
|
||||||
|
/// how the creation should be done.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
|
/// <param name="field">The field we want to index.</param>
|
||||||
|
/// <param name="indexCreationOptions">Options for creating an index.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
/// <returns>The result of the create index operation.</returns>
|
||||||
|
Task<string> CreateHashedIndexAsync<TDocument, TKey>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a combined text index.
|
||||||
|
/// IndexCreationOptions can be supplied to further specify
|
||||||
|
/// how the creation should be done.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <param name="fields">The fields we want to index.</param>
|
||||||
|
/// <param name="indexCreationOptions">Options for creating an index.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
/// <returns>The result of the create index operation.</returns>
|
||||||
|
Task<string> CreateCombinedTextIndexAsync<TDocument>(IEnumerable<Expression<Func<TDocument, object>>> fields, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Creates a combined text index.
|
||||||
|
/// IndexCreationOptions can be supplied to further specify
|
||||||
|
/// how the creation should be done.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
|
/// <param name="fields">The fields we want to index.</param>
|
||||||
|
/// <param name="indexCreationOptions">Options for creating an index.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
/// <returns>The result of the create index operation.</returns>
|
||||||
|
Task<string> CreateCombinedTextIndexAsync<TDocument, TKey>(IEnumerable<Expression<Func<TDocument, object>>> fields, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Drops the index given a field name
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <param name="indexName">The name of the index</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key</param>
|
||||||
|
Task DropIndexAsync<TDocument>(string indexName, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Drops the index given a field name
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
|
/// <param name="indexName">The name of the index</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key</param>
|
||||||
|
Task DropIndexAsync<TDocument, TKey>(string indexName, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the names of the indexes present on a collection.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <param name="partitionKey">An optional partition key</param>
|
||||||
|
/// <returns>A list containing the names of the indexes on on the concerned collection.</returns>
|
||||||
|
Task<List<string>> GetIndexesNamesAsync<TDocument>(string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Returns the names of the indexes present on a collection.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
|
/// <param name="partitionKey">An optional partition key</param>
|
||||||
|
/// <returns>A list containing the names of the indexes on on the concerned collection.</returns>
|
||||||
|
Task<List<string>> GetIndexesNamesAsync<TDocument, TKey>(string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
}
|
||||||
|
}
|
||||||
+2
-24
@@ -19,40 +19,18 @@ namespace MongoDbGenericRepository
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
IMongoDatabase Database { get; }
|
IMongoDatabase Database { get; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// The private GetCollection method
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TDocument"></typeparam>
|
|
||||||
IMongoCollection<TDocument> GetCollection<TDocument>();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a collection for a document type that has a partition key.
|
/// Returns a collection for a document type that has a partition key.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument"></typeparam>
|
/// <typeparam name="TDocument"></typeparam>
|
||||||
/// <param name="partitionKey">The value of the partition key.</param>
|
/// <param name="partitionKey">The value of the partition key.</param>
|
||||||
IMongoCollection<TDocument> GetCollection<TDocument>(string partitionKey) where TDocument : IDocument;
|
IMongoCollection<TDocument> GetCollection<TDocument>(string partitionKey = null);
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a collection for a document type that has a partition key.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
|
||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
|
||||||
/// <param name="partitionKey">The value of the partition key.</param>
|
|
||||||
IMongoCollection<TDocument> GetCollection<TDocument, TKey>(string partitionKey)
|
|
||||||
where TDocument : IDocument<TKey>
|
|
||||||
where TKey : IEquatable<TKey>;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Drops a collection, use very carefully.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TDocument"></typeparam>
|
|
||||||
void DropCollection<TDocument>();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Drops a collection having a partitionkey, use very carefully.
|
/// Drops a collection having a partitionkey, use very carefully.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument"></typeparam>
|
/// <typeparam name="TDocument"></typeparam>
|
||||||
void DropCollection<TDocument>(string partitionKey);
|
void DropCollection<TDocument>(string partitionKey = null);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the Guid representation of the MongoDb Driver.
|
/// Sets the Guid representation of the MongoDb Driver.
|
||||||
+187
-1
@@ -159,7 +159,6 @@ namespace MongoDbGenericRepository
|
|||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>;
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a collection cursor.
|
/// Returns a collection cursor.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -239,6 +238,193 @@ namespace MongoDbGenericRepository
|
|||||||
where TKey : IEquatable<TKey>;
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
|
#region Min / Max
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="orderByDescending">A property selector to order by descending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
Task<TDocument> GetByMaxAsync<TDocument>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByDescending, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="orderByDescending">A property selector to order by descending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
TDocument GetByMax<TDocument>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByDescending, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="orderByAscending">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
Task<TDocument> GetByMinAsync<TDocument>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByAscending, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="orderByAscending">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
TDocument GetByMin<TDocument>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByAscending, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="orderByAscending">A property selector to order by descending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
Task<TDocument> GetByMaxAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByDescending, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="orderByAscending">A property selector to order by descending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
TDocument GetByMax<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByDescending, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the minimum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="orderByAscending">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByAscending, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the minimum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="orderByAscending">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByAscending, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the maximum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="maxValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
Task<TValue> GetMaxValueAsync<TDocument, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the maximum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="orderByAscending">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the maximum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="maxValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
TValue GetMaxValue<TDocument, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the maximum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="orderByAscending">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
TValue GetMaxValue<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> orderByDescending, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="minValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
Task<TValue> GetMinValueAsync<TDocument, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="minValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="minValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
TValue GetMinValue<TDocument, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="minValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
TValue GetMinValue<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>;
|
||||||
|
|
||||||
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MongoDbGenericRepository.Attributes
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// This attribute allows you to specify of the name of the collection.
|
||||||
|
/// Added at commit c117bf2a7fee378f1e02199dea9b2023a7089ee2 by https://github.com/Etchelon
|
||||||
|
/// who has included the CollectionName attribute into the repo to give another choice to the user on how
|
||||||
|
/// to name their collections.
|
||||||
|
/// The attribute takes precedence of course, and if not present the library will fall back to your Pluralize method.
|
||||||
|
/// </summary>
|
||||||
|
[AttributeUsage(AttributeTargets.Class)]
|
||||||
|
public class CollectionNameAttribute : Attribute
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The name of the collection in which your documents are stored.
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The constructor.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name">The name of the collection.</param>
|
||||||
|
public CollectionNameAttribute(string name)
|
||||||
|
{
|
||||||
|
this.Name = name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
using MongoDB.Driver;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using MongoDbGenericRepository.Models;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
|
namespace MongoDbGenericRepository
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The base Repository, it is meant to be inherited from by your custom custom MongoRepository implementation.
|
||||||
|
/// Its constructor must be given a connection string and a database name.
|
||||||
|
/// </summary>
|
||||||
|
public abstract partial class BaseMongoRepository : ReadOnlyMongoRepository, IBaseMongoRepository
|
||||||
|
{
|
||||||
|
#region Index Management
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task<string> CreateTextIndexAsync<TDocument>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return await CreateTextIndexAsync<TDocument, Guid>(field, indexCreationOptions, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task<string> CreateTextIndexAsync<TDocument, TKey>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return await HandlePartitioned<TDocument, TKey>(partitionKey).Indexes
|
||||||
|
.CreateOneAsync(
|
||||||
|
new CreateIndexModel<TDocument>(
|
||||||
|
Builders<TDocument>.IndexKeys.Text(field),
|
||||||
|
indexCreationOptions == null ? null : MapIndexOptions(indexCreationOptions)
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task<string> CreateAscendingIndexAsync<TDocument>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null) where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return await CreateAscendingIndexAsync<TDocument, Guid>(field, indexCreationOptions, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task<string> CreateAscendingIndexAsync<TDocument, TKey>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
var collection = HandlePartitioned<TDocument, TKey>(partitionKey);
|
||||||
|
var createOptions = indexCreationOptions == null ? null : MapIndexOptions(indexCreationOptions);
|
||||||
|
var indexKey = Builders<TDocument>.IndexKeys;
|
||||||
|
return await collection.Indexes
|
||||||
|
.CreateOneAsync(
|
||||||
|
new CreateIndexModel<TDocument>(indexKey.Ascending(field), createOptions));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task<string> CreateDescendingIndexAsync<TDocument>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return await CreateDescendingIndexAsync<TDocument, Guid>(field, indexCreationOptions, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task<string> CreateDescendingIndexAsync<TDocument, TKey>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
var collection = HandlePartitioned<TDocument, TKey>(partitionKey);
|
||||||
|
var createOptions = indexCreationOptions == null ? null : MapIndexOptions(indexCreationOptions);
|
||||||
|
var indexKey = Builders<TDocument>.IndexKeys;
|
||||||
|
return await collection.Indexes
|
||||||
|
.CreateOneAsync(
|
||||||
|
new CreateIndexModel<TDocument>(indexKey.Descending(field), createOptions));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task<string> CreateHashedIndexAsync<TDocument>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return await CreateHashedIndexAsync<TDocument, Guid>(field, indexCreationOptions, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task<string> CreateHashedIndexAsync<TDocument, TKey>(Expression<Func<TDocument, object>> field, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
var collection = HandlePartitioned<TDocument, TKey>(partitionKey);
|
||||||
|
var createOptions = indexCreationOptions == null ? null : MapIndexOptions(indexCreationOptions);
|
||||||
|
var indexKey = Builders<TDocument>.IndexKeys;
|
||||||
|
return await collection.Indexes
|
||||||
|
.CreateOneAsync(
|
||||||
|
new CreateIndexModel<TDocument>(indexKey.Hashed(field), createOptions));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task<string> CreateCombinedTextIndexAsync<TDocument>(IEnumerable<Expression<Func<TDocument, object>>> fields, IndexCreationOptions indexCreationOptions = null, string partitionKey = null) where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return await CreateCombinedTextIndexAsync<TDocument, Guid>(fields, indexCreationOptions, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task<string> CreateCombinedTextIndexAsync<TDocument, TKey>(IEnumerable<Expression<Func<TDocument, object>>> fields, IndexCreationOptions indexCreationOptions = null, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
var collection = HandlePartitioned<TDocument, TKey>(partitionKey);
|
||||||
|
var createOptions = indexCreationOptions == null ? null : MapIndexOptions(indexCreationOptions);
|
||||||
|
var listOfDefs = new List<IndexKeysDefinition<TDocument>>();
|
||||||
|
foreach (var field in fields)
|
||||||
|
{
|
||||||
|
listOfDefs.Add(Builders<TDocument>.IndexKeys.Text(field));
|
||||||
|
}
|
||||||
|
return await collection.Indexes
|
||||||
|
.CreateOneAsync(new CreateIndexModel<TDocument>(Builders<TDocument>.IndexKeys.Combine(listOfDefs), createOptions));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task DropIndexAsync<TDocument>(string indexName, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
await DropIndexAsync<TDocument, Guid>(indexName, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task DropIndexAsync<TDocument, TKey>(string indexName, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
await HandlePartitioned<TDocument, TKey>(partitionKey).Indexes.DropOneAsync(indexName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task<List<string>> GetIndexesNamesAsync<TDocument>(string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return await GetIndexesNamesAsync<TDocument, Guid>(partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <inheritdoc />
|
||||||
|
public async Task<List<string>> GetIndexesNamesAsync<TDocument, TKey>(string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
var indexCursor = await HandlePartitioned<TDocument, TKey>(partitionKey).Indexes.ListAsync();
|
||||||
|
var indexes = await indexCursor.ToListAsync();
|
||||||
|
return indexes.Select(e => e["name"].ToString()).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endregion Index Management
|
||||||
|
|
||||||
|
private CreateIndexOptions MapIndexOptions(IndexCreationOptions indexCreationOptions)
|
||||||
|
{
|
||||||
|
return new CreateIndexOptions
|
||||||
|
{
|
||||||
|
Unique = indexCreationOptions.Unique,
|
||||||
|
TextIndexVersion = indexCreationOptions.TextIndexVersion,
|
||||||
|
SphereIndexVersion = indexCreationOptions.SphereIndexVersion,
|
||||||
|
Sparse = indexCreationOptions.Sparse,
|
||||||
|
Name = indexCreationOptions.Name,
|
||||||
|
Min = indexCreationOptions.Min,
|
||||||
|
Max = indexCreationOptions.Max,
|
||||||
|
LanguageOverride = indexCreationOptions.LanguageOverride,
|
||||||
|
ExpireAfter = indexCreationOptions.ExpireAfter,
|
||||||
|
DefaultLanguage = indexCreationOptions.DefaultLanguage,
|
||||||
|
BucketSize = indexCreationOptions.BucketSize,
|
||||||
|
Bits = indexCreationOptions.Bits,
|
||||||
|
Background = indexCreationOptions.Background,
|
||||||
|
Version = indexCreationOptions.Version
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,10 +13,8 @@ namespace MongoDbGenericRepository
|
|||||||
/// The base Repository, it is meant to be inherited from by your custom custom MongoRepository implementation.
|
/// The base Repository, it is meant to be inherited from by your custom custom MongoRepository implementation.
|
||||||
/// Its constructor must be given a connection string and a database name.
|
/// Its constructor must be given a connection string and a database name.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public abstract class BaseMongoRepository : ReadOnlyMongoRepository, IBaseMongoRepository
|
public abstract partial class BaseMongoRepository : ReadOnlyMongoRepository, IBaseMongoRepository
|
||||||
{
|
{
|
||||||
private static readonly Random Random = new Random();
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The constructor taking a connection string and a database name.
|
/// The constructor taking a connection string and a database name.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -53,7 +51,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <param name="document">The document you want to add.</param>
|
/// <param name="document">The document you want to add.</param>
|
||||||
public async Task AddOneAsync<TDocument>(TDocument document) where TDocument : IDocument
|
public virtual async Task AddOneAsync<TDocument>(TDocument document) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
FormatDocument(document);
|
FormatDocument(document);
|
||||||
await HandlePartitioned(document).InsertOneAsync(document);
|
await HandlePartitioned(document).InsertOneAsync(document);
|
||||||
@@ -65,7 +63,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <param name="document">The document you want to add.</param>
|
/// <param name="document">The document you want to add.</param>
|
||||||
public void AddOne<TDocument>(TDocument document) where TDocument : IDocument
|
public virtual void AddOne<TDocument>(TDocument document) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
FormatDocument(document);
|
FormatDocument(document);
|
||||||
HandlePartitioned(document).InsertOne(document);
|
HandlePartitioned(document).InsertOne(document);
|
||||||
@@ -77,26 +75,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <param name="documents">The documents you want to add.</param>
|
/// <param name="documents">The documents you want to add.</param>
|
||||||
public async Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents) where TDocument : IDocument
|
public virtual async Task AddManyAsync<TDocument>(IEnumerable<TDocument> documents) where TDocument : IDocument
|
||||||
{
|
|
||||||
if (!documents.Any())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
foreach (var doc in documents)
|
|
||||||
{
|
|
||||||
FormatDocument(doc);
|
|
||||||
}
|
|
||||||
await HandlePartitioned(documents.FirstOrDefault()).InsertManyAsync(documents);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Adds a list of documents to the collection.
|
|
||||||
/// Populates the Id and AddedAtUtc fields if necessary.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
|
||||||
/// <param name="documents">The documents you want to add.</param>
|
|
||||||
public void AddMany<TDocument>(IEnumerable<TDocument> documents) where TDocument : IDocument
|
|
||||||
{
|
{
|
||||||
if (!documents.Any())
|
if (!documents.Any())
|
||||||
{
|
{
|
||||||
@@ -106,7 +85,48 @@ namespace MongoDbGenericRepository
|
|||||||
{
|
{
|
||||||
FormatDocument(document);
|
FormatDocument(document);
|
||||||
}
|
}
|
||||||
HandlePartitioned(documents.FirstOrDefault()).InsertMany(documents.ToList());
|
// cannot use typeof(IPartitionedDocument).IsAssignableFrom(typeof(TDocument)), not available in netstandard 1.5
|
||||||
|
if (documents.Any(e => e is IPartitionedDocument))
|
||||||
|
{
|
||||||
|
foreach (var group in documents.GroupBy(e => ((IPartitionedDocument)e).PartitionKey))
|
||||||
|
{
|
||||||
|
await HandlePartitioned(group.FirstOrDefault()).InsertManyAsync(group.ToList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await GetCollection<TDocument>().InsertManyAsync(documents.ToList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds a list of documents to the collection.
|
||||||
|
/// Populates the Id and AddedAtUtc fields if necessary.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <param name="documents">The documents you want to add.</param>
|
||||||
|
public virtual void AddMany<TDocument>(IEnumerable<TDocument> documents) where TDocument : IDocument
|
||||||
|
{
|
||||||
|
if (!documents.Any())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
foreach (var document in documents)
|
||||||
|
{
|
||||||
|
FormatDocument(document);
|
||||||
|
}
|
||||||
|
// cannot use typeof(IPartitionedDocument).IsAssignableFrom(typeof(TDocument)), not available in netstandard 1.5
|
||||||
|
if (documents.Any(e => e is IPartitionedDocument))
|
||||||
|
{
|
||||||
|
foreach (var group in documents.GroupBy(e => ((IPartitionedDocument)e).PartitionKey))
|
||||||
|
{
|
||||||
|
HandlePartitioned(group.FirstOrDefault()).InsertMany(group.ToList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GetCollection<TDocument>().InsertMany(documents.ToList());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion Create
|
#endregion Create
|
||||||
@@ -120,7 +140,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
/// <param name="document">The document you want to add.</param>
|
/// <param name="document">The document you want to add.</param>
|
||||||
public async Task AddOneAsync<TDocument, TKey>(TDocument document)
|
public virtual async Task AddOneAsync<TDocument, TKey>(TDocument document)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -135,7 +155,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
/// <param name="document">The document you want to add.</param>
|
/// <param name="document">The document you want to add.</param>
|
||||||
public void AddOne<TDocument, TKey>(TDocument document)
|
public virtual void AddOne<TDocument, TKey>(TDocument document)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -150,29 +170,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
/// <param name="documents">The documents you want to add.</param>
|
/// <param name="documents">The documents you want to add.</param>
|
||||||
public async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents)
|
public virtual async Task AddManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents)
|
||||||
where TDocument : IDocument<TKey>
|
|
||||||
where TKey : IEquatable<TKey>
|
|
||||||
{
|
|
||||||
if (!documents.Any())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
foreach (var doc in documents)
|
|
||||||
{
|
|
||||||
FormatDocument<TDocument, TKey>(doc);
|
|
||||||
}
|
|
||||||
await HandlePartitioned<TDocument, TKey>(documents.FirstOrDefault()).InsertManyAsync(documents);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Adds a list of documents to the collection.
|
|
||||||
/// Populates the Id and AddedAtUtc fields if necessary.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
|
||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
|
||||||
/// <param name="documents">The documents you want to add.</param>
|
|
||||||
public void AddMany<TDocument, TKey>(IEnumerable<TDocument> documents)
|
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -184,9 +182,52 @@ namespace MongoDbGenericRepository
|
|||||||
{
|
{
|
||||||
FormatDocument<TDocument, TKey>(document);
|
FormatDocument<TDocument, TKey>(document);
|
||||||
}
|
}
|
||||||
HandlePartitioned<TDocument, TKey>(documents.FirstOrDefault()).InsertMany(documents.ToList());
|
// cannot use typeof(IPartitionedDocument).IsAssignableFrom(typeof(TDocument)), not available in netstandard 1.5
|
||||||
|
if (documents.Any(e => e is IPartitionedDocument))
|
||||||
|
{
|
||||||
|
foreach (var group in documents.GroupBy(e => ((IPartitionedDocument)e).PartitionKey))
|
||||||
|
{
|
||||||
|
await HandlePartitioned<TDocument, TKey>(group.FirstOrDefault()).InsertManyAsync(group.ToList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await GetCollection<TDocument, TKey>().InsertManyAsync(documents.ToList());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds a list of documents to the collection.
|
||||||
|
/// Populates the Id and AddedAtUtc fields if necessary.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
|
/// <param name="documents">The documents you want to add.</param>
|
||||||
|
public virtual void AddMany<TDocument, TKey>(IEnumerable<TDocument> documents)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
if (!documents.Any())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
foreach (var document in documents)
|
||||||
|
{
|
||||||
|
FormatDocument<TDocument, TKey>(document);
|
||||||
|
}
|
||||||
|
// cannot use typeof(IPartitionedDocument).IsAssignableFrom(typeof(TDocument)), not available in netstandard 1.5
|
||||||
|
if (documents.Any(e => e is IPartitionedDocument))
|
||||||
|
{
|
||||||
|
foreach (var group in documents.GroupBy(e => ((IPartitionedDocument)e).PartitionKey))
|
||||||
|
{
|
||||||
|
HandlePartitioned<TDocument, TKey>(group.FirstOrDefault()).InsertMany(group.ToList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GetCollection<TDocument, TKey>().InsertMany(documents.ToList());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@@ -197,7 +238,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
|
/// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
|
||||||
public async Task<bool> UpdateOneAsync<TDocument>(TDocument modifiedDocument) where TDocument : IDocument
|
public virtual async Task<bool> UpdateOneAsync<TDocument>(TDocument modifiedDocument) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
var updateRes = await HandlePartitioned(modifiedDocument).ReplaceOneAsync(x => x.Id == modifiedDocument.Id, modifiedDocument);
|
var updateRes = await HandlePartitioned(modifiedDocument).ReplaceOneAsync(x => x.Id == modifiedDocument.Id, modifiedDocument);
|
||||||
return updateRes.ModifiedCount == 1;
|
return updateRes.ModifiedCount == 1;
|
||||||
@@ -208,7 +249,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
|
/// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
|
||||||
public bool UpdateOne<TDocument>(TDocument modifiedDocument) where TDocument : IDocument
|
public virtual bool UpdateOne<TDocument>(TDocument modifiedDocument) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
var updateRes = HandlePartitioned(modifiedDocument).ReplaceOne(x => x.Id == modifiedDocument.Id, modifiedDocument);
|
var updateRes = HandlePartitioned(modifiedDocument).ReplaceOne(x => x.Id == modifiedDocument.Id, modifiedDocument);
|
||||||
return updateRes.ModifiedCount == 1;
|
return updateRes.ModifiedCount == 1;
|
||||||
@@ -220,7 +261,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <param name="documentToModify">The document you want to modify.</param>
|
/// <param name="documentToModify">The document you want to modify.</param>
|
||||||
/// <param name="update">The update definition for the document.</param>
|
/// <param name="update">The update definition for the document.</param>
|
||||||
public async Task<bool> UpdateOneAsync<TDocument>(TDocument documentToModify, UpdateDefinition<TDocument> update)
|
public virtual async Task<bool> UpdateOneAsync<TDocument>(TDocument documentToModify, UpdateDefinition<TDocument> update)
|
||||||
where TDocument : IDocument
|
where TDocument : IDocument
|
||||||
{
|
{
|
||||||
var filter = Builders<TDocument>.Filter.Eq("Id", documentToModify.Id);
|
var filter = Builders<TDocument>.Filter.Eq("Id", documentToModify.Id);
|
||||||
@@ -236,7 +277,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="documentToModify">The document you want to modify.</param>
|
/// <param name="documentToModify">The document you want to modify.</param>
|
||||||
/// <param name="field">The field selector.</param>
|
/// <param name="field">The field selector.</param>
|
||||||
/// <param name="value">The new value of the property field.</param>
|
/// <param name="value">The new value of the property field.</param>
|
||||||
public bool UpdateOne<TDocument, TField>(TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value)
|
public virtual bool UpdateOne<TDocument, TField>(TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value)
|
||||||
where TDocument : IDocument
|
where TDocument : IDocument
|
||||||
{
|
{
|
||||||
var filter = Builders<TDocument>.Filter.Eq("Id", documentToModify.Id);
|
var filter = Builders<TDocument>.Filter.Eq("Id", documentToModify.Id);
|
||||||
@@ -252,7 +293,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="documentToModify">The document you want to modify.</param>
|
/// <param name="documentToModify">The document you want to modify.</param>
|
||||||
/// <param name="field">The field selector.</param>
|
/// <param name="field">The field selector.</param>
|
||||||
/// <param name="value">The new value of the property field.</param>
|
/// <param name="value">The new value of the property field.</param>
|
||||||
public async Task<bool> UpdateOneAsync<TDocument, TField>(TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value)
|
public virtual async Task<bool> UpdateOneAsync<TDocument, TField>(TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value)
|
||||||
where TDocument : IDocument
|
where TDocument : IDocument
|
||||||
{
|
{
|
||||||
var filter = Builders<TDocument>.Filter.Eq("Id", documentToModify.Id);
|
var filter = Builders<TDocument>.Filter.Eq("Id", documentToModify.Id);
|
||||||
@@ -269,7 +310,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="field">The field selector.</param>
|
/// <param name="field">The field selector.</param>
|
||||||
/// <param name="value">The new value of the property field.</param>
|
/// <param name="value">The new value of the property field.</param>
|
||||||
/// <param name="partitionKey">The value of the partition key.</param>
|
/// <param name="partitionKey">The value of the partition key.</param>
|
||||||
public bool UpdateOne<TDocument, TField>(FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
public virtual bool UpdateOne<TDocument, TField>(FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
||||||
where TDocument : IDocument
|
where TDocument : IDocument
|
||||||
{
|
{
|
||||||
var collection = string.IsNullOrEmpty(partitionKey) ? GetCollection<TDocument>() : GetCollection<TDocument>(partitionKey);
|
var collection = string.IsNullOrEmpty(partitionKey) ? GetCollection<TDocument>() : GetCollection<TDocument>(partitionKey);
|
||||||
@@ -277,6 +318,23 @@ namespace MongoDbGenericRepository
|
|||||||
return updateRes.ModifiedCount == 1;
|
return updateRes.ModifiedCount == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// For the entity selected by the filter, updates the property field with the given value.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TField">The type of the field.</typeparam>
|
||||||
|
/// <param name="filter">The document filter.</param>
|
||||||
|
/// <param name="field">The field selector.</param>
|
||||||
|
/// <param name="value">The new value of the property field.</param>
|
||||||
|
/// <param name="partitionKey">The partition key for the document.</param>
|
||||||
|
public virtual bool UpdateOne<TDocument, TField>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
var collection = string.IsNullOrEmpty(partitionKey) ? GetCollection<TDocument>() : GetCollection<TDocument>(partitionKey);
|
||||||
|
var updateRes = collection.UpdateOne(Builders<TDocument>.Filter.Where(filter), Builders<TDocument>.Update.Set(field, value));
|
||||||
|
return updateRes.ModifiedCount == 1;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates the property field with the given value update a property field in entities.
|
/// Updates the property field with the given value update a property field in entities.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -286,7 +344,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="field">The field selector.</param>
|
/// <param name="field">The field selector.</param>
|
||||||
/// <param name="value">The new value of the property field.</param>
|
/// <param name="value">The new value of the property field.</param>
|
||||||
/// <param name="partitionKey">The value of the partition key.</param>
|
/// <param name="partitionKey">The value of the partition key.</param>
|
||||||
public async Task<bool> UpdateOneAsync<TDocument, TField>(FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
public virtual async Task<bool> UpdateOneAsync<TDocument, TField>(FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
||||||
where TDocument : IDocument
|
where TDocument : IDocument
|
||||||
{
|
{
|
||||||
var collection = string.IsNullOrEmpty(partitionKey) ? GetCollection<TDocument>() : GetCollection<TDocument>(partitionKey);
|
var collection = string.IsNullOrEmpty(partitionKey) ? GetCollection<TDocument>() : GetCollection<TDocument>(partitionKey);
|
||||||
@@ -294,13 +352,30 @@ namespace MongoDbGenericRepository
|
|||||||
return updateRes.ModifiedCount == 1;
|
return updateRes.ModifiedCount == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// For the entity selected by the filter, updates the property field with the given value.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TField">The type of the field.</typeparam>
|
||||||
|
/// <param name="filter">The document filter.</param>
|
||||||
|
/// <param name="field">The field selector.</param>
|
||||||
|
/// <param name="value">The new value of the property field.</param>
|
||||||
|
/// <param name="partitionKey">The partition key for the document.</param>
|
||||||
|
public virtual async Task<bool> UpdateOneAsync<TDocument, TField>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
var collection = string.IsNullOrEmpty(partitionKey) ? GetCollection<TDocument>() : GetCollection<TDocument>(partitionKey);
|
||||||
|
var updateRes = await collection.UpdateOneAsync(Builders<TDocument>.Filter.Where(filter), Builders<TDocument>.Update.Set(field, value));
|
||||||
|
return updateRes.ModifiedCount == 1;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Takes a document you want to modify and applies the update you have defined in MongoDb.
|
/// Takes a document you want to modify and applies the update you have defined in MongoDb.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <param name="documentToModify">The document you want to modify.</param>
|
/// <param name="documentToModify">The document you want to modify.</param>
|
||||||
/// <param name="update">The update definition for the document.</param>
|
/// <param name="update">The update definition for the document.</param>
|
||||||
public bool UpdateOne<TDocument>(TDocument documentToModify, UpdateDefinition<TDocument> update)
|
public virtual bool UpdateOne<TDocument>(TDocument documentToModify, UpdateDefinition<TDocument> update)
|
||||||
where TDocument : IDocument
|
where TDocument : IDocument
|
||||||
{
|
{
|
||||||
var filter = Builders<TDocument>.Filter.Eq("Id", documentToModify.Id);
|
var filter = Builders<TDocument>.Filter.Eq("Id", documentToModify.Id);
|
||||||
@@ -318,7 +393,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
/// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
|
/// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
|
||||||
public async Task<bool> UpdateOneAsync<TDocument, TKey>(TDocument modifiedDocument)
|
public virtual async Task<bool> UpdateOneAsync<TDocument, TKey>(TDocument modifiedDocument)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -333,7 +408,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
/// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
|
/// <param name="modifiedDocument">The document with the modifications you want to persist.</param>
|
||||||
public bool UpdateOne<TDocument, TKey>(TDocument modifiedDocument)
|
public virtual bool UpdateOne<TDocument, TKey>(TDocument modifiedDocument)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -349,7 +424,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
/// <param name="documentToModify">The document you want to modify.</param>
|
/// <param name="documentToModify">The document you want to modify.</param>
|
||||||
/// <param name="update">The update definition for the document.</param>
|
/// <param name="update">The update definition for the document.</param>
|
||||||
public async Task<bool> UpdateOneAsync<TDocument, TKey>(TDocument documentToModify, UpdateDefinition<TDocument> update)
|
public virtual async Task<bool> UpdateOneAsync<TDocument, TKey>(TDocument documentToModify, UpdateDefinition<TDocument> update)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -365,7 +440,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
/// <param name="documentToModify">The document you want to modify.</param>
|
/// <param name="documentToModify">The document you want to modify.</param>
|
||||||
/// <param name="update">The update definition for the document.</param>
|
/// <param name="update">The update definition for the document.</param>
|
||||||
public bool UpdateOne<TDocument, TKey>(TDocument documentToModify, UpdateDefinition<TDocument> update)
|
public virtual bool UpdateOne<TDocument, TKey>(TDocument documentToModify, UpdateDefinition<TDocument> update)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -383,7 +458,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="documentToModify">The document you want to modify.</param>
|
/// <param name="documentToModify">The document you want to modify.</param>
|
||||||
/// <param name="field">The field selector.</param>
|
/// <param name="field">The field selector.</param>
|
||||||
/// <param name="value">The new value of the property field.</param>
|
/// <param name="value">The new value of the property field.</param>
|
||||||
public async Task<bool> UpdateOneAsync<TDocument, TKey, TField>(TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value)
|
public virtual async Task<bool> UpdateOneAsync<TDocument, TKey, TField>(TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -401,7 +476,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="documentToModify">The document you want to modify.</param>
|
/// <param name="documentToModify">The document you want to modify.</param>
|
||||||
/// <param name="field">The field selector.</param>
|
/// <param name="field">The field selector.</param>
|
||||||
/// <param name="value">The new value of the property field.</param>
|
/// <param name="value">The new value of the property field.</param>
|
||||||
public bool UpdateOne<TDocument, TKey, TField>(TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value)
|
public virtual bool UpdateOne<TDocument, TKey, TField>(TDocument documentToModify, Expression<Func<TDocument, TField>> field, TField value)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -420,7 +495,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="field">The field selector.</param>
|
/// <param name="field">The field selector.</param>
|
||||||
/// <param name="value">The new value of the property field.</param>
|
/// <param name="value">The new value of the property field.</param>
|
||||||
/// <param name="partitionKey">The value of the partition key.</param>
|
/// <param name="partitionKey">The value of the partition key.</param>
|
||||||
public async Task<bool> UpdateOneAsync<TDocument, TKey, TField>(FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
public virtual async Task<bool> UpdateOneAsync<TDocument, TKey, TField>(FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -430,7 +505,24 @@ namespace MongoDbGenericRepository
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Updates the property field with the given value update a property field in entities.
|
/// For the entity selected by the filter, updates the property field with the given value.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
|
/// <typeparam name="TField">The type of the field.</typeparam>
|
||||||
|
/// <param name="filter">The document filter.</param>
|
||||||
|
/// <param name="field">The field selector.</param>
|
||||||
|
/// <param name="value">The new value of the property field.</param>
|
||||||
|
/// <param name="partitionKey">The partition key for the document.</param>
|
||||||
|
public virtual async Task<bool> UpdateOneAsync<TDocument, TKey, TField>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return await UpdateOneAsync<TDocument, TKey, TField>(Builders<TDocument>.Filter.Where(filter), field, value, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Updates the property field with the given value.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
@@ -439,7 +531,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="field">The field selector.</param>
|
/// <param name="field">The field selector.</param>
|
||||||
/// <param name="value">The new value of the property field.</param>
|
/// <param name="value">The new value of the property field.</param>
|
||||||
/// <param name="partitionKey">The value of the partition key.</param>
|
/// <param name="partitionKey">The value of the partition key.</param>
|
||||||
public bool UpdateOne<TDocument, TKey, TField>(FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
public virtual bool UpdateOne<TDocument, TKey, TField>(FilterDefinition<TDocument> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -448,6 +540,23 @@ namespace MongoDbGenericRepository
|
|||||||
return updateRes.ModifiedCount == 1;
|
return updateRes.ModifiedCount == 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// For the entity selected by the filter, updates the property field with the given value.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
|
/// <typeparam name="TField">The type of the field.</typeparam>
|
||||||
|
/// <param name="filter">The document filter.</param>
|
||||||
|
/// <param name="field">The field selector.</param>
|
||||||
|
/// <param name="value">The new value of the property field.</param>
|
||||||
|
/// <param name="partitionKey">The partition key for the document.</param>
|
||||||
|
public virtual bool UpdateOne<TDocument, TKey, TField>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TField>> field, TField value, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return UpdateOne<TDocument, TKey, TField>(Builders<TDocument>.Filter.Where(filter), field, value, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion Update
|
#endregion Update
|
||||||
|
|
||||||
#region Delete
|
#region Delete
|
||||||
@@ -458,9 +567,9 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <param name="document">The document you want to delete.</param>
|
/// <param name="document">The document you want to delete.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public async Task<long> DeleteOneAsync<TDocument>(TDocument document) where TDocument : IDocument
|
public virtual async Task<long> DeleteOneAsync<TDocument>(TDocument document) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
return (await HandlePartitioned(document).DeleteOneAsync(x => x.Id == document.Id)).DeletedCount;
|
return await DeleteOneAsync<TDocument, Guid>(document);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -469,9 +578,9 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <param name="document">The document you want to delete.</param>
|
/// <param name="document">The document you want to delete.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public long DeleteOne<TDocument>(TDocument document) where TDocument : IDocument
|
public virtual long DeleteOne<TDocument>(TDocument document) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
return HandlePartitioned(document).DeleteOne(x => x.Id == document.Id).DeletedCount;
|
return DeleteOne<TDocument, Guid>(document);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -481,9 +590,9 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter">A LINQ expression filter.</param>
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public long DeleteOne<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
public virtual long DeleteOne<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
return HandlePartitioned<TDocument>(partitionKey).DeleteOne(filter).DeletedCount;
|
return DeleteOne<TDocument, Guid>(filter, partitionKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -493,9 +602,9 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter">A LINQ expression filter.</param>
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public async Task<long> DeleteOneAsync<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
public virtual async Task<long> DeleteOneAsync<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
return (await HandlePartitioned<TDocument>(partitionKey).DeleteOneAsync(filter)).DeletedCount;
|
return await DeleteOneAsync<TDocument, Guid>(filter, partitionKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -505,7 +614,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter">A LINQ expression filter.</param>
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public async Task<long> DeleteManyAsync<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
public virtual async Task<long> DeleteManyAsync<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
return (await HandlePartitioned<TDocument>(partitionKey).DeleteManyAsync(filter)).DeletedCount;
|
return (await HandlePartitioned<TDocument>(partitionKey).DeleteManyAsync(filter)).DeletedCount;
|
||||||
}
|
}
|
||||||
@@ -516,14 +625,9 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <param name="documents">The list of documents to delete.</param>
|
/// <param name="documents">The list of documents to delete.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public async Task<long> DeleteManyAsync<TDocument>(IEnumerable<TDocument> documents) where TDocument : IDocument
|
public virtual async Task<long> DeleteManyAsync<TDocument>(IEnumerable<TDocument> documents) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
if (!documents.Any())
|
return await DeleteManyAsync<TDocument, Guid>(documents);
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
var idsTodelete = documents.Select(e => e.Id).ToArray();
|
|
||||||
return (await HandlePartitioned(documents.FirstOrDefault()).DeleteManyAsync(x => idsTodelete.Contains(x.Id))).DeletedCount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -532,14 +636,9 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <param name="documents">The list of documents to delete.</param>
|
/// <param name="documents">The list of documents to delete.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public long DeleteMany<TDocument>(IEnumerable<TDocument> documents) where TDocument : IDocument
|
public virtual long DeleteMany<TDocument>(IEnumerable<TDocument> documents) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
if (!documents.Any())
|
return DeleteMany<TDocument, Guid>(documents);
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
var idsTodelete = documents.Select(e => e.Id).ToArray();
|
|
||||||
return HandlePartitioned(documents.FirstOrDefault()).DeleteMany(x => idsTodelete.Contains(x.Id)).DeletedCount;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -549,7 +648,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter">A LINQ expression filter.</param>
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public long DeleteMany<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
public virtual long DeleteMany<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
return HandlePartitioned<TDocument>(partitionKey).DeleteMany(filter).DeletedCount;
|
return HandlePartitioned<TDocument>(partitionKey).DeleteMany(filter).DeletedCount;
|
||||||
}
|
}
|
||||||
@@ -565,7 +664,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
/// <param name="document">The document you want to delete.</param>
|
/// <param name="document">The document you want to delete.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public long DeleteOne<TDocument, TKey>(TDocument document)
|
public virtual long DeleteOne<TDocument, TKey>(TDocument document)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -580,7 +679,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
/// <param name="document">The document you want to delete.</param>
|
/// <param name="document">The document you want to delete.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public async Task<long> DeleteOneAsync<TDocument, TKey>(TDocument document)
|
public virtual async Task<long> DeleteOneAsync<TDocument, TKey>(TDocument document)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -596,7 +695,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter">A LINQ expression filter.</param>
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public long DeleteOne<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
|
public virtual long DeleteOne<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -611,7 +710,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter">A LINQ expression filter.</param>
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public async Task<long> DeleteOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
|
public virtual async Task<long> DeleteOneAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -626,7 +725,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter">A LINQ expression filter.</param>
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public async Task<long> DeleteManyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
|
public virtual async Task<long> DeleteManyAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -640,7 +739,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
/// <param name="documents">The list of documents to delete.</param>
|
/// <param name="documents">The list of documents to delete.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public async Task<long> DeleteManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents)
|
public virtual async Task<long> DeleteManyAsync<TDocument, TKey>(IEnumerable<TDocument> documents)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -648,8 +747,22 @@ namespace MongoDbGenericRepository
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
var idsTodelete = documents.Select(e => e.Id).ToArray();
|
// cannot use typeof(IPartitionedDocument).IsAssignableFrom(typeof(TDocument)), not available in netstandard 1.5
|
||||||
return (await HandlePartitioned<TDocument, TKey>(documents.FirstOrDefault()).DeleteManyAsync(x => idsTodelete.Contains(x.Id))).DeletedCount;
|
if (documents.Any(e => e is IPartitionedDocument))
|
||||||
|
{
|
||||||
|
long deleteCount = 0;
|
||||||
|
foreach (var group in documents.GroupBy(e => ((IPartitionedDocument)e).PartitionKey))
|
||||||
|
{
|
||||||
|
var groupIdsTodelete = group.Select(e => e.Id).ToArray();
|
||||||
|
deleteCount += (await HandlePartitioned<TDocument, TKey>(group.FirstOrDefault()).DeleteManyAsync(x => groupIdsTodelete.Contains(x.Id))).DeletedCount;
|
||||||
|
}
|
||||||
|
return deleteCount;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var idsTodelete = documents.Select(e => e.Id).ToArray();
|
||||||
|
return (await HandlePartitioned<TDocument, TKey>(documents.FirstOrDefault()).DeleteManyAsync(x => idsTodelete.Contains(x.Id))).DeletedCount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -659,7 +772,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
||||||
/// <param name="documents">The list of documents to delete.</param>
|
/// <param name="documents">The list of documents to delete.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public long DeleteMany<TDocument, TKey>(IEnumerable<TDocument> documents)
|
public virtual long DeleteMany<TDocument, TKey>(IEnumerable<TDocument> documents)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -667,8 +780,22 @@ namespace MongoDbGenericRepository
|
|||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
var idsTodelete = documents.Select(e => e.Id).ToArray();
|
// cannot use typeof(IPartitionedDocument).IsAssignableFrom(typeof(TDocument)), not available in netstandard 1.5
|
||||||
return HandlePartitioned<TDocument, TKey>(documents.FirstOrDefault()).DeleteMany(x => idsTodelete.Contains(x.Id)).DeletedCount;
|
if (documents.Any(e => e is IPartitionedDocument))
|
||||||
|
{
|
||||||
|
long deleteCount = 0;
|
||||||
|
foreach (var group in documents.GroupBy(e => ((IPartitionedDocument)e).PartitionKey))
|
||||||
|
{
|
||||||
|
var groupIdsTodelete = group.Select(e => e.Id).ToArray();
|
||||||
|
deleteCount += (HandlePartitioned<TDocument, TKey>(group.FirstOrDefault()).DeleteMany(x => groupIdsTodelete.Contains(x.Id))).DeletedCount;
|
||||||
|
}
|
||||||
|
return deleteCount;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var idsTodelete = documents.Select(e => e.Id).ToArray();
|
||||||
|
return (HandlePartitioned<TDocument, TKey>(documents.FirstOrDefault()).DeleteMany(x => idsTodelete.Contains(x.Id))).DeletedCount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -679,7 +806,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter">A LINQ expression filter.</param>
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
/// <returns>The number of documents deleted.</returns>
|
/// <returns>The number of documents deleted.</returns>
|
||||||
public long DeleteMany<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
|
public virtual long DeleteMany<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, string partitionKey = null)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -698,7 +825,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter"></param>
|
/// <param name="filter"></param>
|
||||||
/// <param name="projection">The projection expression.</param>
|
/// <param name="projection">The projection expression.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
public async Task<TProjection> ProjectOneAsync<TDocument, TProjection>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
public virtual async Task<TProjection> ProjectOneAsync<TDocument, TProjection>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
||||||
where TDocument : IDocument
|
where TDocument : IDocument
|
||||||
where TProjection : class
|
where TProjection : class
|
||||||
{
|
{
|
||||||
@@ -716,7 +843,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter"></param>
|
/// <param name="filter"></param>
|
||||||
/// <param name="projection">The projection expression.</param>
|
/// <param name="projection">The projection expression.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
public async Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
public virtual async Task<TProjection> ProjectOneAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
where TProjection : class
|
where TProjection : class
|
||||||
@@ -734,7 +861,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter"></param>
|
/// <param name="filter"></param>
|
||||||
/// <param name="projection">The projection expression.</param>
|
/// <param name="projection">The projection expression.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
public TProjection ProjectOne<TDocument, TProjection>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
public virtual TProjection ProjectOne<TDocument, TProjection>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
||||||
where TDocument : IDocument
|
where TDocument : IDocument
|
||||||
where TProjection : class
|
where TProjection : class
|
||||||
{
|
{
|
||||||
@@ -752,7 +879,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter"></param>
|
/// <param name="filter"></param>
|
||||||
/// <param name="projection">The projection expression.</param>
|
/// <param name="projection">The projection expression.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
public TProjection ProjectOne<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
public virtual TProjection ProjectOne<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
where TProjection : class
|
where TProjection : class
|
||||||
@@ -770,7 +897,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter"></param>
|
/// <param name="filter"></param>
|
||||||
/// <param name="projection">The projection expression.</param>
|
/// <param name="projection">The projection expression.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
public async Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
public virtual async Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
||||||
where TDocument : IDocument
|
where TDocument : IDocument
|
||||||
where TProjection : class
|
where TProjection : class
|
||||||
{
|
{
|
||||||
@@ -788,7 +915,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter"></param>
|
/// <param name="filter"></param>
|
||||||
/// <param name="projection">The projection expression.</param>
|
/// <param name="projection">The projection expression.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
public async Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
public virtual async Task<List<TProjection>> ProjectManyAsync<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
where TProjection : class
|
where TProjection : class
|
||||||
@@ -806,7 +933,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter"></param>
|
/// <param name="filter"></param>
|
||||||
/// <param name="projection">The projection expression.</param>
|
/// <param name="projection">The projection expression.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
public List<TProjection> ProjectMany<TDocument, TProjection>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
public virtual List<TProjection> ProjectMany<TDocument, TProjection>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
||||||
where TDocument : IDocument
|
where TDocument : IDocument
|
||||||
where TProjection : class
|
where TProjection : class
|
||||||
{
|
{
|
||||||
@@ -824,7 +951,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="filter">The document filter.</param>
|
/// <param name="filter">The document filter.</param>
|
||||||
/// <param name="projection">The projection expression.</param>
|
/// <param name="projection">The projection expression.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
public List<TProjection> ProjectMany<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
public virtual List<TProjection> ProjectMany<TDocument, TProjection, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TProjection>> projection, string partitionKey = null)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
where TProjection : class
|
where TProjection : class
|
||||||
@@ -848,7 +975,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="groupingCriteria">The grouping criteria.</param>
|
/// <param name="groupingCriteria">The grouping criteria.</param>
|
||||||
/// <param name="groupProjection">The projected group result.</param>
|
/// <param name="groupProjection">The projected group result.</param>
|
||||||
/// <param name="partitionKey">The partition key of your document, if any.</param>
|
/// <param name="partitionKey">The partition key of your document, if any.</param>
|
||||||
public List<TProjection> GroupBy<TDocument, TGroupKey, TProjection>(
|
public virtual List<TProjection> GroupBy<TDocument, TGroupKey, TProjection>(
|
||||||
Expression<Func<TDocument, TGroupKey>> groupingCriteria,
|
Expression<Func<TDocument, TGroupKey>> groupingCriteria,
|
||||||
Expression<Func<IGrouping<TGroupKey, TDocument>, TProjection>> groupProjection,
|
Expression<Func<IGrouping<TGroupKey, TDocument>, TProjection>> groupProjection,
|
||||||
string partitionKey = null)
|
string partitionKey = null)
|
||||||
@@ -873,7 +1000,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="selector">The grouping criteria.</param>
|
/// <param name="selector">The grouping criteria.</param>
|
||||||
/// <param name="projection">The projected group result.</param>
|
/// <param name="projection">The projected group result.</param>
|
||||||
/// <param name="partitionKey">The partition key of your document, if any.</param>
|
/// <param name="partitionKey">The partition key of your document, if any.</param>
|
||||||
public List<TProjection> GroupBy<TDocument, TGroupKey, TProjection>(Expression<Func<TDocument, bool>> filter,
|
public virtual List<TProjection> GroupBy<TDocument, TGroupKey, TProjection>(Expression<Func<TDocument, bool>> filter,
|
||||||
Expression<Func<TDocument, TGroupKey>> selector,
|
Expression<Func<TDocument, TGroupKey>> selector,
|
||||||
Expression<Func<IGrouping<TGroupKey, TDocument>, TProjection>> projection,
|
Expression<Func<IGrouping<TGroupKey, TDocument>, TProjection>> projection,
|
||||||
string partitionKey = null)
|
string partitionKey = null)
|
||||||
@@ -898,7 +1025,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="skipNumber">The number of documents you want to skip. Default value is 0.</param>
|
/// <param name="skipNumber">The number of documents you want to skip. Default value is 0.</param>
|
||||||
/// <param name="takeNumber">The number of documents you want to take. Default value is 50.</param>
|
/// <param name="takeNumber">The number of documents you want to take. Default value is 50.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
public async Task<List<TDocument>> GetPaginatedAsync<TDocument>(Expression<Func<TDocument, bool>> filter, int skipNumber = 0, int takeNumber = 50, string partitionKey = null)
|
public virtual async Task<List<TDocument>> GetPaginatedAsync<TDocument>(Expression<Func<TDocument, bool>> filter, int skipNumber = 0, int takeNumber = 50, string partitionKey = null)
|
||||||
where TDocument : IDocument
|
where TDocument : IDocument
|
||||||
{
|
{
|
||||||
return await HandlePartitioned<TDocument>(partitionKey).Find(filter).Skip(skipNumber).Limit(takeNumber).ToListAsync();
|
return await HandlePartitioned<TDocument>(partitionKey).Find(filter).Skip(skipNumber).Limit(takeNumber).ToListAsync();
|
||||||
@@ -913,7 +1040,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="skipNumber">The number of documents you want to skip. Default value is 0.</param>
|
/// <param name="skipNumber">The number of documents you want to skip. Default value is 0.</param>
|
||||||
/// <param name="takeNumber">The number of documents you want to take. Default value is 50.</param>
|
/// <param name="takeNumber">The number of documents you want to take. Default value is 50.</param>
|
||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
public async Task<List<TDocument>> GetPaginatedAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, int skipNumber = 0, int takeNumber = 50, string partitionKey = null)
|
public virtual async Task<List<TDocument>> GetPaginatedAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, int skipNumber = 0, int takeNumber = 50, string partitionKey = null)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -930,7 +1057,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="update"></param>
|
/// <param name="update"></param>
|
||||||
/// <param name="options"></param>
|
/// <param name="options"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<TDocument> GetAndUpdateOne<TDocument>(FilterDefinition<TDocument> filter, UpdateDefinition<TDocument> update, FindOneAndUpdateOptions<TDocument, TDocument> options) where TDocument : IDocument
|
public virtual async Task<TDocument> GetAndUpdateOne<TDocument>(FilterDefinition<TDocument> filter, UpdateDefinition<TDocument> update, FindOneAndUpdateOptions<TDocument, TDocument> options) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
return await GetCollection<TDocument>().FindOneAndUpdateAsync(filter, update, options);
|
return await GetCollection<TDocument>().FindOneAndUpdateAsync(filter, update, options);
|
||||||
}
|
}
|
||||||
@@ -944,7 +1071,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="update"></param>
|
/// <param name="update"></param>
|
||||||
/// <param name="options"></param>
|
/// <param name="options"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public async Task<TDocument> GetAndUpdateOne<TDocument, TKey>(FilterDefinition<TDocument> filter, UpdateDefinition<TDocument> update, FindOneAndUpdateOptions<TDocument, TDocument> options)
|
public virtual async Task<TDocument> GetAndUpdateOne<TDocument, TKey>(FilterDefinition<TDocument> filter, UpdateDefinition<TDocument> update, FindOneAndUpdateOptions<TDocument, TDocument> options)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
@@ -953,26 +1080,6 @@ namespace MongoDbGenericRepository
|
|||||||
|
|
||||||
#endregion Find And Update
|
#endregion Find And Update
|
||||||
|
|
||||||
|
|
||||||
private TKey SetIdField<TKey>()
|
|
||||||
{
|
|
||||||
var idTypeName = typeof(TKey).Name;
|
|
||||||
switch (idTypeName)
|
|
||||||
{
|
|
||||||
case "Guid":
|
|
||||||
return (TKey)(object)Guid.NewGuid();
|
|
||||||
case "Int16":
|
|
||||||
return (TKey)(object)Random.Next(1, short.MaxValue);
|
|
||||||
case "Int32":
|
|
||||||
return (TKey)(object)Random.Next(1, int.MaxValue);
|
|
||||||
case "Int64":
|
|
||||||
return (TKey)(object)(Random.NextLong(1, long.MaxValue));
|
|
||||||
case "String":
|
|
||||||
return (TKey)(object)Guid.NewGuid().ToString();
|
|
||||||
}
|
|
||||||
throw new ArgumentException($"{idTypeName} is not a supported Id type, the Id of the document cannot be set.");
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the value of the document Id if it is not set already.
|
/// Sets the value of the document Id if it is not set already.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -992,7 +1099,7 @@ namespace MongoDbGenericRepository
|
|||||||
|| (defaultTKey != null
|
|| (defaultTKey != null
|
||||||
&& defaultTKey.Equals(document.Id)))
|
&& defaultTKey.Equals(document.Id)))
|
||||||
{
|
{
|
||||||
document.Id = SetIdField<TKey>();
|
document.Id = IdGenerator.GetId<TKey>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,71 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace MongoDbGenericRepository.Models
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Options for creating an index.
|
||||||
|
/// </summary>
|
||||||
|
public class IndexCreationOptions
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether the index is a unique index.
|
||||||
|
/// </summary>
|
||||||
|
public bool? Unique { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the index version for text indexes.
|
||||||
|
/// </summary>
|
||||||
|
public int? TextIndexVersion { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the index version for 2dsphere indexes.
|
||||||
|
/// </summary>
|
||||||
|
public int? SphereIndexVersion { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether the index is a sparse index.
|
||||||
|
/// </summary>
|
||||||
|
public bool? Sparse { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the index name.
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the min value for 2d indexes.
|
||||||
|
/// </summary>
|
||||||
|
public double? Min { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the max value for 2d indexes.
|
||||||
|
/// </summary>
|
||||||
|
public double? Max { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the language override.
|
||||||
|
/// </summary>
|
||||||
|
public string LanguageOverride { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets when documents expire (used with TTL indexes).
|
||||||
|
/// </summary>
|
||||||
|
public TimeSpan? ExpireAfter { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the default language.
|
||||||
|
/// </summary>
|
||||||
|
public string DefaultLanguage { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the size of a geohash bucket.
|
||||||
|
/// </summary>
|
||||||
|
public double? BucketSize { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the precision, in bits, used with geohash indexes.
|
||||||
|
/// </summary>
|
||||||
|
public int? Bits { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets a value indicating whether to create the index in the background.
|
||||||
|
/// </summary>
|
||||||
|
public bool? Background { get; set; }
|
||||||
|
/// <summary>
|
||||||
|
/// Gets or sets the version of the index.
|
||||||
|
/// </summary>
|
||||||
|
public int? Version { get; set; }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
using MongoDB.Driver;
|
using MongoDB.Driver;
|
||||||
using MongoDbGenericRepository.Models;
|
using MongoDbGenericRepository.Attributes;
|
||||||
using MongoDbGenericRepository.Utils;
|
using MongoDbGenericRepository.Utils;
|
||||||
using System;
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
namespace MongoDbGenericRepository
|
namespace MongoDbGenericRepository
|
||||||
{
|
{
|
||||||
@@ -20,27 +21,33 @@ namespace MongoDbGenericRepository
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public IMongoDatabase Database { get; }
|
public IMongoDatabase Database { get; }
|
||||||
|
|
||||||
static MongoDbContext()
|
|
||||||
{
|
|
||||||
// Avoid legacy UUID representation: use Binary 0x04 subtype.
|
|
||||||
MongoDefaults.GuidRepresentation = MongoDB.Bson.GuidRepresentation.Standard;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Sets the Guid representation of the MongoDb Driver.
|
/// Sets the Guid representation of the MongoDb Driver.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="guidRepresentation">The new value of the GuidRepresentation</param>
|
/// <param name="guidRepresentation">The new value of the GuidRepresentation</param>
|
||||||
public void SetGuidRepresentation(MongoDB.Bson.GuidRepresentation guidRepresentation)
|
public virtual void SetGuidRepresentation(MongoDB.Bson.GuidRepresentation guidRepresentation)
|
||||||
{
|
{
|
||||||
MongoDefaults.GuidRepresentation = guidRepresentation;
|
MongoDefaults.GuidRepresentation = guidRepresentation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initialize the Guid representation of the MongoDb Driver.
|
||||||
|
/// Override this method to change the default GuidRepresentation.
|
||||||
|
/// </summary>
|
||||||
|
protected virtual void InitializeGuidRepresentation()
|
||||||
|
{
|
||||||
|
// by default, avoid lefacy UUID representation: use Binary 0x04 subtype.
|
||||||
|
MongoDefaults.GuidRepresentation = MongoDB.Bson.GuidRepresentation.Standard;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The constructor of the MongoDbContext, it needs a an object implementing <see cref="IMongoDatabase"/>.
|
/// The constructor of the MongoDbContext, it needs a an object implementing <see cref="IMongoDatabase"/>.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="mongoDatabase">An object implementing IMongoDatabase</param>
|
/// <param name="mongoDatabase">An object implementing IMongoDatabase</param>
|
||||||
public MongoDbContext(IMongoDatabase mongoDatabase)
|
public MongoDbContext(IMongoDatabase mongoDatabase)
|
||||||
{
|
{
|
||||||
|
// Avoid legacy UUID representation: use Binary 0x04 subtype.
|
||||||
|
InitializeGuidRepresentation();
|
||||||
Database = mongoDatabase;
|
Database = mongoDatabase;
|
||||||
Client = Database.Client;
|
Client = Database.Client;
|
||||||
}
|
}
|
||||||
@@ -52,66 +59,63 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="databaseName">The name of your database.</param>
|
/// <param name="databaseName">The name of your database.</param>
|
||||||
public MongoDbContext(string connectionString, string databaseName)
|
public MongoDbContext(string connectionString, string databaseName)
|
||||||
{
|
{
|
||||||
|
InitializeGuidRepresentation();
|
||||||
Client = new MongoClient(connectionString);
|
Client = new MongoClient(connectionString);
|
||||||
Database = Client.GetDatabase(databaseName);
|
Database = Client.GetDatabase(databaseName);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The private GetCollection method
|
/// Extracts the CollectionName attribute from the entity type, if any.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <returns></returns>
|
/// <returns>The name of the collection in which the TDocument is stored.</returns>
|
||||||
public IMongoCollection<TDocument> GetCollection<TDocument>()
|
private string GetAttributeCollectionName<TDocument>()
|
||||||
{
|
{
|
||||||
return Database.GetCollection<TDocument>(Pluralize<TDocument>());
|
return (typeof(TDocument).GetTypeInfo()
|
||||||
|
.GetCustomAttributes(typeof(CollectionNameAttribute))
|
||||||
|
.FirstOrDefault() as CollectionNameAttribute)?.Name;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Returns a collection for a document type that has a partition key.
|
/// Returns a collection for a document type. Also handles document types with a partition key.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <param name="partitionKey">The value of the partition key.</param>
|
/// <param name="partitionKey">The optional value of the partition key.</param>
|
||||||
public IMongoCollection<TDocument> GetCollection<TDocument>(string partitionKey) where TDocument : IDocument
|
public IMongoCollection<TDocument> GetCollection<TDocument>(string partitionKey = null)
|
||||||
{
|
{
|
||||||
return Database.GetCollection<TDocument>(partitionKey +"-"+ Pluralize<TDocument>());
|
return Database.GetCollection<TDocument>(GetCollectionName<TDocument>(partitionKey));
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Returns a collection for a document type that has a partition key.
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
|
||||||
/// <typeparam name="TKey">The type of the primary key for a Document.</typeparam>
|
|
||||||
/// <param name="partitionKey">The value of the partition key.</param>
|
|
||||||
public IMongoCollection<TDocument> GetCollection<TDocument, TKey>(string partitionKey)
|
|
||||||
where TDocument : IDocument<TKey>
|
|
||||||
where TKey : IEquatable<TKey>
|
|
||||||
{
|
|
||||||
return Database.GetCollection<TDocument>(partitionKey + "-" + Pluralize<TDocument>());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Drops a collection, use very carefully.
|
/// Drops a collection, use very carefully.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
public void DropCollection<TDocument>()
|
public void DropCollection<TDocument>(string partitionKey = null)
|
||||||
{
|
{
|
||||||
Database.DropCollection(Pluralize<TDocument>());
|
Database.DropCollection(GetCollectionName<TDocument>(partitionKey));
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Drops a collection having a partitionkey, use very carefully.
|
/// Given the docmuent type and the partition key, returns the name of the collection it belongs to.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
public void DropCollection<TDocument>(string partitionKey)
|
/// <param name="partitionKey">The value of the partition key.</param>
|
||||||
|
/// <returns>The name of the collection.</returns>
|
||||||
|
private string GetCollectionName<TDocument>(string partitionKey)
|
||||||
{
|
{
|
||||||
Database.DropCollection(partitionKey + "-" + Pluralize<TDocument>());
|
var collectionName = GetAttributeCollectionName<TDocument>() ?? Pluralize<TDocument>();
|
||||||
|
if (string.IsNullOrEmpty(partitionKey))
|
||||||
|
{
|
||||||
|
return collectionName;
|
||||||
|
}
|
||||||
|
return $"{partitionKey}-{collectionName}";
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Very naively pluralizes a TDocument type name.
|
/// Very naively pluralizes a TDocument type name.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
/// <typeparam name="TDocument">The type representing a Document.</typeparam>
|
||||||
/// <returns></returns>
|
/// <returns>The pluralized document name.</returns>
|
||||||
private string Pluralize<TDocument>()
|
private string Pluralize<TDocument>()
|
||||||
{
|
{
|
||||||
return (typeof(TDocument).Name.Pluralize()).Camelize();
|
return (typeof(TDocument).Name.Pluralize()).Camelize();
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="MongoDB.Driver" Version="2.5.0" />
|
<PackageReference Include="MongoDB.Driver" Version="2.7.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<package >
|
<package >
|
||||||
<metadata>
|
<metadata>
|
||||||
<id>MongoDbGenericRepository</id>
|
<id>MongoDbGenericRepository</id>
|
||||||
<version>1.3.4</version>
|
<version>1.3.8</version>
|
||||||
<title>MongoDb Generic Repository</title>
|
<title>MongoDb Generic Repository</title>
|
||||||
<authors>Alexandre Spieser</authors>
|
<authors>Alexandre Spieser</authors>
|
||||||
<owners>Alexandre Spieser</owners>
|
<owners>Alexandre Spieser</owners>
|
||||||
@@ -10,11 +10,11 @@
|
|||||||
<projectUrl>https://github.com/alexandre-spieser/mongodb-generic-repository</projectUrl>
|
<projectUrl>https://github.com/alexandre-spieser/mongodb-generic-repository</projectUrl>
|
||||||
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
<requireLicenseAcceptance>false</requireLicenseAcceptance>
|
||||||
<description>A generic repository implementation using the MongoDB C# Sharp 2.0 driver.</description>
|
<description>A generic repository implementation using the MongoDB C# Sharp 2.0 driver.</description>
|
||||||
<releaseNotes>Updating MongoDB driver to version 2.5.0 for MongoDB 3.6 support.</releaseNotes>
|
<releaseNotes>Release notes are at https://github.com/alexandre-spieser/mongodb-generic-repository/releases</releaseNotes>
|
||||||
<copyright>Copyright 2017 (c) Alexandre Spieser. All rights reserved.</copyright>
|
<copyright>Copyright 2018 (c) Alexandre Spieser. All rights reserved.</copyright>
|
||||||
<tags>MongoDb Repository Generic NoSql</tags>
|
<tags>MongoDb Repository Generic NoSql</tags>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<dependency id="MongoDB.Driver" version="2.5.0" />
|
<dependency id="MongoDB.Driver" version="2.7.0" />
|
||||||
</dependencies>
|
</dependencies>
|
||||||
</metadata>
|
</metadata>
|
||||||
<files>
|
<files>
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
public async Task<bool> AnyAsync<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
public async Task<bool> AnyAsync<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
var count = await HandlePartitioned<TDocument>(partitionKey).CountAsync(filter);
|
var count = await HandlePartitioned<TDocument>(partitionKey).CountDocumentsAsync(filter);
|
||||||
return (count > 0);
|
return (count > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,7 +135,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="partitionKey">An optional partition key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
public bool Any<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
public bool Any<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
var count = HandlePartitioned<TDocument>(partitionKey).Count(filter);
|
var count = HandlePartitioned<TDocument>(partitionKey).CountDocuments(filter);
|
||||||
return (count > 0);
|
return (count > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -169,7 +169,7 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="partitionKey">An optional partitionKey</param>
|
/// <param name="partitionKey">An optional partitionKey</param>
|
||||||
public async Task<long> CountAsync<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
public async Task<long> CountAsync<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
return await HandlePartitioned<TDocument>(partitionKey).CountAsync(filter);
|
return await HandlePartitioned<TDocument>(partitionKey).CountDocumentsAsync(filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -180,7 +180,60 @@ namespace MongoDbGenericRepository
|
|||||||
/// <param name="partitionKey">An optional partitionKey</param>
|
/// <param name="partitionKey">An optional partitionKey</param>
|
||||||
public long Count<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
public long Count<TDocument>(Expression<Func<TDocument, bool>> filter, string partitionKey = null) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
return HandlePartitioned<TDocument>(partitionKey).Find(filter).Count();
|
return HandlePartitioned<TDocument>(partitionKey).Find(filter).CountDocuments();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="maxValueSelector">A property selector to order by descending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
public async Task<TDocument> GetByMaxAsync<TDocument>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> maxValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return await GetByMaxAsync<TDocument, Guid>(filter, maxValueSelector, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="maxValueSelector">A property selector to order by descending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public TDocument GetByMax<TDocument>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> maxValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return GetByMax<TDocument, Guid>(filter, maxValueSelector, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="minValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
public async Task<TDocument> GetByMinAsync<TDocument>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return await GetByMinAsync<TDocument, Guid>(filter, minValueSelector, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="orderByAscending">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
public TDocument GetByMin<TDocument>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> orderByAscending, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return GetByMin<TDocument, Guid>(filter, orderByAscending, partitionKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -270,7 +323,7 @@ namespace MongoDbGenericRepository
|
|||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
var count = await HandlePartitioned<TDocument, TKey>(partitionKey).CountAsync(filter);
|
var count = await HandlePartitioned<TDocument, TKey>(partitionKey).CountDocumentsAsync(filter);
|
||||||
return (count > 0);
|
return (count > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -285,7 +338,7 @@ namespace MongoDbGenericRepository
|
|||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
var count = HandlePartitioned<TDocument, TKey>(partitionKey).Count(filter);
|
var count = HandlePartitioned<TDocument, TKey>(partitionKey).CountDocuments(filter);
|
||||||
return (count > 0);
|
return (count > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -328,7 +381,7 @@ namespace MongoDbGenericRepository
|
|||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
return await HandlePartitioned<TDocument, TKey>(partitionKey).CountAsync(filter);
|
return await HandlePartitioned<TDocument, TKey>(partitionKey).CountDocumentsAsync(filter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -342,7 +395,239 @@ namespace MongoDbGenericRepository
|
|||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
return HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).Count();
|
return HandlePartitioned<TDocument, TKey>(partitionKey).Find(filter).CountDocuments();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="maxValueSelector">A property selector to order by descending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
public async Task<TDocument> GetByMaxAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> maxValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return await GetCollection<TDocument, TKey>(partitionKey).Find(Builders<TDocument>.Filter.Where(filter))
|
||||||
|
.SortByDescending(maxValueSelector)
|
||||||
|
.Limit(1)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the maximum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="maxValueSelector">A property selector to order by descending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
public TDocument GetByMax<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> maxValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return GetCollection<TDocument, TKey>(partitionKey).Find(Builders<TDocument>.Filter.Where(filter))
|
||||||
|
.SortByDescending(maxValueSelector)
|
||||||
|
.Limit(1)
|
||||||
|
.FirstOrDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the minimum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="minValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
public async Task<TDocument> GetByMinAsync<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return await GetCollection<TDocument, TKey>(partitionKey).Find(Builders<TDocument>.Filter.Where(filter))
|
||||||
|
.SortBy(minValueSelector)
|
||||||
|
.Limit(1)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the document with the minimum value of a specified property in a MongoDB collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="minValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
public TDocument GetByMin<TDocument, TKey>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, object>> minValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return GetCollection<TDocument, TKey>(partitionKey).Find(Builders<TDocument>.Filter.Where(filter))
|
||||||
|
.SortBy(minValueSelector)
|
||||||
|
.Limit(1)
|
||||||
|
.FirstOrDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="minValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
private IFindFluent<TDocument, TDocument> GetMinMongoQuery<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return GetCollection<TDocument, TKey>(partitionKey).Find(Builders<TDocument>.Filter.Where(filter))
|
||||||
|
.SortBy(ConvertExpression(minValueSelector))
|
||||||
|
.Limit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="maxValueSelector">A property selector to order by descending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
private IFindFluent<TDocument, TDocument> GetMaxMongoQuery<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return GetCollection<TDocument, TKey>(partitionKey).Find(Builders<TDocument>.Filter.Where(filter))
|
||||||
|
.SortByDescending(ConvertExpression(maxValueSelector))
|
||||||
|
.Limit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the maximum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="maxValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
public async Task<TValue> GetMaxValueAsync<TDocument, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return await GetMaxValueAsync<TDocument, Guid, TValue>(filter, maxValueSelector, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the maximum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="orderByAscending">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
public async Task<TValue> GetMaxValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return await GetMaxMongoQuery<TDocument, TKey, TValue>(filter, maxValueSelector, partitionKey)
|
||||||
|
.Project(maxValueSelector)
|
||||||
|
.FirstOrDefaultAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the maximum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="maxValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
public TValue GetMaxValue<TDocument, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return GetMaxValue<TDocument, Guid, TValue>(filter, maxValueSelector, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the maximum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="maxValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partitionKey.</param>
|
||||||
|
public TValue GetMaxValue<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> maxValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
|
||||||
|
return GetMaxMongoQuery<TDocument, TKey, TValue>(filter, maxValueSelector, partitionKey)
|
||||||
|
.Project(maxValueSelector)
|
||||||
|
.FirstOrDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="minValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
public async Task<TValue> GetMinValueAsync<TDocument, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return await GetMinValueAsync<TDocument, Guid, TValue>(filter, minValueSelector, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="minValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
public async Task<TValue> GetMinValueAsync<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return await GetMinMongoQuery<TDocument, TKey, TValue>(filter, minValueSelector, partitionKey).Project(minValueSelector).FirstOrDefaultAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="minValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
public TValue GetMinValue<TDocument, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument
|
||||||
|
{
|
||||||
|
return GetMinValue<TDocument, Guid, TValue>(filter, minValueSelector, partitionKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the minimum value of a property in a mongodb collections that is satisfying the filter.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value used to order the query.</typeparam>
|
||||||
|
/// <param name="filter">A LINQ expression filter.</param>
|
||||||
|
/// <param name="minValueSelector">A property selector to order by ascending.</param>
|
||||||
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
|
public TValue GetMinValue<TDocument, TKey, TValue>(Expression<Func<TDocument, bool>> filter, Expression<Func<TDocument, TValue>> minValueSelector, string partitionKey = null)
|
||||||
|
where TDocument : IDocument<TKey>
|
||||||
|
where TKey : IEquatable<TKey>
|
||||||
|
{
|
||||||
|
return GetMinMongoQuery<TDocument, TKey, TValue>(filter, minValueSelector, partitionKey).Project(minValueSelector).FirstOrDefault();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -350,26 +635,16 @@ namespace MongoDbGenericRepository
|
|||||||
#region Utility Methods
|
#region Utility Methods
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a collections for the type TDocument with the matching partition key.
|
/// Gets a collections for the type TDocument with the matching partition key (if any).
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <typeparam name="TDocument">The document type.</typeparam>
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
/// <param name="partitionKey">The partion key.</param>
|
/// <param name="partitionKey">An optional partition key.</param>
|
||||||
/// <returns>An <see cref="IMongoCollection{TDocument}"/></returns>
|
/// <returns>An <see cref="IMongoCollection{TDocument}"/></returns>
|
||||||
protected IMongoCollection<TDocument> GetCollection<TDocument>(string partitionKey) where TDocument : IDocument
|
protected IMongoCollection<TDocument> GetCollection<TDocument>(string partitionKey = null) where TDocument : IDocument
|
||||||
{
|
{
|
||||||
return MongoDbContext.GetCollection<TDocument>(partitionKey);
|
return MongoDbContext.GetCollection<TDocument>(partitionKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a collections for the type TDocument
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TDocument">The document type.</typeparam>
|
|
||||||
/// <returns></returns>
|
|
||||||
protected IMongoCollection<TDocument> GetCollection<TDocument>() where TDocument : IDocument
|
|
||||||
{
|
|
||||||
return MongoDbContext.GetCollection<TDocument>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets a collections for the type TDocument
|
/// Gets a collections for the type TDocument
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -425,24 +700,11 @@ namespace MongoDbGenericRepository
|
|||||||
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
||||||
/// <param name="partitionKey">The collection partition key.</param>
|
/// <param name="partitionKey">The collection partition key.</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
protected IMongoCollection<TDocument> GetCollection<TDocument, TKey>(string partitionKey)
|
protected IMongoCollection<TDocument> GetCollection<TDocument, TKey>(string partitionKey = null)
|
||||||
where TDocument : IDocument<TKey>
|
where TDocument : IDocument<TKey>
|
||||||
where TKey : IEquatable<TKey>
|
where TKey : IEquatable<TKey>
|
||||||
{
|
{
|
||||||
return MongoDbContext.GetCollection<TDocument, TKey>(partitionKey);
|
return MongoDbContext.GetCollection<TDocument>(partitionKey);
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Gets a collections for the type TDocument
|
|
||||||
/// </summary>
|
|
||||||
/// <typeparam name="TDocument">The document type.</typeparam>
|
|
||||||
/// <typeparam name="TKey">The type of the primary key.</typeparam>
|
|
||||||
/// <returns></returns>
|
|
||||||
protected IMongoCollection<TDocument> GetCollection<TDocument, TKey>()
|
|
||||||
where TDocument : IDocument<TKey>
|
|
||||||
where TKey : IEquatable<TKey>
|
|
||||||
{
|
|
||||||
return MongoDbContext.GetCollection<TDocument>();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -463,6 +725,20 @@ namespace MongoDbGenericRepository
|
|||||||
return GetCollection<TDocument, TKey>();
|
return GetCollection<TDocument, TKey>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Converts a LINQ expression of TDocument, TValue to a LINQ expression of TDocument, object
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TDocument">The document type.</typeparam>
|
||||||
|
/// <typeparam name="TValue">The type of the value.</typeparam>
|
||||||
|
/// <param name="expression">The expression to convert</param>
|
||||||
|
protected static Expression<Func<TDocument, object>> ConvertExpression<TDocument, TValue>(Expression<Func<TDocument, TValue>> expression)
|
||||||
|
{
|
||||||
|
var param = expression.Parameters[0];
|
||||||
|
Expression body = expression.Body;
|
||||||
|
var convert = Expression.Convert(body, typeof(object));
|
||||||
|
return Expression.Lambda<Func<TDocument, object>>(convert, param);
|
||||||
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,39 @@
|
|||||||
|
using MongoDB.Bson;
|
||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MongoDbGenericRepository.Utils
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The IdGenerator instance, used to generate Ids of different types.
|
||||||
|
/// </summary>
|
||||||
|
public static class IdGenerator
|
||||||
|
{
|
||||||
|
private static readonly Random Random = new Random();
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Generates a random value of a given type.
|
||||||
|
/// </summary>
|
||||||
|
/// <typeparam name="TKey">The type of the value to generate.</typeparam>
|
||||||
|
/// <returns>A value of type TKey.</returns>
|
||||||
|
public static TKey GetId<TKey>()
|
||||||
|
{
|
||||||
|
var idTypeName = typeof(TKey).Name;
|
||||||
|
switch (idTypeName)
|
||||||
|
{
|
||||||
|
case "Guid":
|
||||||
|
return (TKey)(object)Guid.NewGuid();
|
||||||
|
case "Int16":
|
||||||
|
return (TKey)(object)Random.Next(1, short.MaxValue);
|
||||||
|
case "Int32":
|
||||||
|
return (TKey)(object)Random.Next(1, int.MaxValue);
|
||||||
|
case "Int64":
|
||||||
|
return (TKey)(object)(Random.NextLong(1, long.MaxValue));
|
||||||
|
case "String":
|
||||||
|
return (TKey)(object)Guid.NewGuid().ToString();
|
||||||
|
case "ObjectId":
|
||||||
|
return (TKey)(object)ObjectId.GenerateNewId();
|
||||||
|
}
|
||||||
|
throw new ArgumentException($"{idTypeName} is not a supported Id type, the Id of the document cannot be set.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"runtimeTarget": {
|
"runtimeTarget": {
|
||||||
"name": ".NETStandard,Version=v1.5/",
|
"name": ".NETStandard,Version=v1.5/",
|
||||||
"signature": "795a70ab1bbc13177859af16f1887befe3221c54"
|
"signature": "b945d8e228876adfa8e84019c7873fce5baf0c0b"
|
||||||
},
|
},
|
||||||
"compilationOptions": {},
|
"compilationOptions": {},
|
||||||
"targets": {
|
"targets": {
|
||||||
@@ -9,7 +9,7 @@
|
|||||||
".NETStandard,Version=v1.5/": {
|
".NETStandard,Version=v1.5/": {
|
||||||
"MongoDbGenericRepository/1.0.0": {
|
"MongoDbGenericRepository/1.0.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"MongoDB.Driver": "2.5.0",
|
"MongoDB.Driver": "2.7.0",
|
||||||
"NETStandard.Library": "1.6.1"
|
"NETStandard.Library": "1.6.1"
|
||||||
},
|
},
|
||||||
"runtime": {
|
"runtime": {
|
||||||
@@ -60,7 +60,7 @@
|
|||||||
"System.Runtime.InteropServices": "4.3.0"
|
"System.Runtime.InteropServices": "4.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"MongoDB.Bson/2.5.0": {
|
"MongoDB.Bson/2.7.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"NETStandard.Library": "1.6.1",
|
"NETStandard.Library": "1.6.1",
|
||||||
"System.Collections.NonGeneric": "4.0.1",
|
"System.Collections.NonGeneric": "4.0.1",
|
||||||
@@ -72,10 +72,10 @@
|
|||||||
"lib/netstandard1.5/MongoDB.Bson.dll": {}
|
"lib/netstandard1.5/MongoDB.Bson.dll": {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"MongoDB.Driver/2.5.0": {
|
"MongoDB.Driver/2.7.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"MongoDB.Bson": "2.5.0",
|
"MongoDB.Bson": "2.7.0",
|
||||||
"MongoDB.Driver.Core": "2.5.0",
|
"MongoDB.Driver.Core": "2.7.0",
|
||||||
"NETStandard.Library": "1.6.1",
|
"NETStandard.Library": "1.6.1",
|
||||||
"System.ComponentModel.TypeConverter": "4.1.0",
|
"System.ComponentModel.TypeConverter": "4.1.0",
|
||||||
"System.Linq.Queryable": "4.0.1"
|
"System.Linq.Queryable": "4.0.1"
|
||||||
@@ -84,10 +84,10 @@
|
|||||||
"lib/netstandard1.5/MongoDB.Driver.dll": {}
|
"lib/netstandard1.5/MongoDB.Driver.dll": {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"MongoDB.Driver.Core/2.5.0": {
|
"MongoDB.Driver.Core/2.7.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"DnsClient": "1.0.7",
|
"DnsClient": "1.0.7",
|
||||||
"MongoDB.Bson": "2.5.0",
|
"MongoDB.Bson": "2.7.0",
|
||||||
"NETStandard.Library": "1.6.1",
|
"NETStandard.Library": "1.6.1",
|
||||||
"System.Collections.Specialized": "4.0.1",
|
"System.Collections.Specialized": "4.0.1",
|
||||||
"System.Diagnostics.TraceSource": "4.0.0",
|
"System.Diagnostics.TraceSource": "4.0.0",
|
||||||
@@ -1021,26 +1021,26 @@
|
|||||||
"path": "microsoft.win32.registry/4.0.0",
|
"path": "microsoft.win32.registry/4.0.0",
|
||||||
"hashPath": "microsoft.win32.registry.4.0.0.nupkg.sha512"
|
"hashPath": "microsoft.win32.registry.4.0.0.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"MongoDB.Bson/2.5.0": {
|
"MongoDB.Bson/2.7.0": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
"serviceable": true,
|
"serviceable": true,
|
||||||
"sha512": "sha512-b7zQAUdSdfJ4kmGzAA+hv89N2Q6jm1td9WfTimgp8xWAsN4qbtIjA/JkAY1HA0Z8xfXQE3EmdUcDEwT8bkXfXg==",
|
"sha512": "sha512-vzpTDHYX/X6gF9qtDuKRJiLkqpj5OZuT1bIzJCiBiU8CwJ37becYmaXuy/QSuWnYN6j6ZdVTWILKbWt2MXL8DA==",
|
||||||
"path": "mongodb.bson/2.5.0",
|
"path": "mongodb.bson/2.7.0",
|
||||||
"hashPath": "mongodb.bson.2.5.0.nupkg.sha512"
|
"hashPath": "mongodb.bson.2.7.0.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"MongoDB.Driver/2.5.0": {
|
"MongoDB.Driver/2.7.0": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
"serviceable": true,
|
"serviceable": true,
|
||||||
"sha512": "sha512-VbHVV8Xdl3PcPU3XxdOUE/yc4BnPokg7k1XHU/3fEM/UdfCy0Ie0eXVE+U2HJXVcM3TQuuyVn+B1La2YY7X8dA==",
|
"sha512": "sha512-5wP5BBwm5YO6h2Vhw6zQmOwSW9WP2d6kgRM6E7uIbwIJz4+j2trS2Wo7/+IYow5WVN8Jd6O27bIB/4gKNepO1Q==",
|
||||||
"path": "mongodb.driver/2.5.0",
|
"path": "mongodb.driver/2.7.0",
|
||||||
"hashPath": "mongodb.driver.2.5.0.nupkg.sha512"
|
"hashPath": "mongodb.driver.2.7.0.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"MongoDB.Driver.Core/2.5.0": {
|
"MongoDB.Driver.Core/2.7.0": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
"serviceable": true,
|
"serviceable": true,
|
||||||
"sha512": "sha512-/JYwBTEoWZDHiSePk0AF775c0YkSGSsHTA2+hWt9/UOCkYV/QOFujAWDdpFzBMCDpmQewbLRR1knYj76YOxffA==",
|
"sha512": "sha512-SepB4KT+zXA3iFaIFwXVKmk6BZIp0EGE/iWqNbDZ1mca9e8EhtqYPwOOzFmEbdKAzmVvF1y86kNI4agWP6I5sg==",
|
||||||
"path": "mongodb.driver.core/2.5.0",
|
"path": "mongodb.driver.core/2.7.0",
|
||||||
"hashPath": "mongodb.driver.core.2.5.0.nupkg.sha512"
|
"hashPath": "mongodb.driver.core.2.7.0.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"NETStandard.Library/1.6.1": {
|
"NETStandard.Library/1.6.1": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"runtimeTarget": {
|
"runtimeTarget": {
|
||||||
"name": ".NETStandard,Version=v2.0/",
|
"name": ".NETStandard,Version=v2.0/",
|
||||||
"signature": "c7b8ca9e84d3f282de57dfcebff465cb47d24ac8"
|
"signature": "af81df2668beb4b8f166ddd0c4c0f1882e8ec745"
|
||||||
},
|
},
|
||||||
"compilationOptions": {},
|
"compilationOptions": {},
|
||||||
"targets": {
|
"targets": {
|
||||||
@@ -9,8 +9,8 @@
|
|||||||
".NETStandard,Version=v2.0/": {
|
".NETStandard,Version=v2.0/": {
|
||||||
"MongoDbGenericRepository/1.0.0": {
|
"MongoDbGenericRepository/1.0.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"MongoDB.Driver": "2.5.0",
|
"MongoDB.Driver": "2.7.0",
|
||||||
"NETStandard.Library": "2.0.1"
|
"NETStandard.Library": "2.0.3"
|
||||||
},
|
},
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"MongoDbGenericRepository.dll": {}
|
"MongoDbGenericRepository.dll": {}
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
"DnsClient/1.0.7": {
|
"DnsClient/1.0.7": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.Win32.Primitives": "4.3.0",
|
"Microsoft.Win32.Primitives": "4.3.0",
|
||||||
"NETStandard.Library": "2.0.1",
|
"NETStandard.Library": "2.0.3",
|
||||||
"System.Buffers": "4.3.0",
|
"System.Buffers": "4.3.0",
|
||||||
"System.Collections": "4.3.0",
|
"System.Collections": "4.3.0",
|
||||||
"System.Collections.Concurrent": "4.3.0",
|
"System.Collections.Concurrent": "4.3.0",
|
||||||
@@ -60,9 +60,9 @@
|
|||||||
"System.Runtime.InteropServices": "4.3.0"
|
"System.Runtime.InteropServices": "4.3.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"MongoDB.Bson/2.5.0": {
|
"MongoDB.Bson/2.7.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"NETStandard.Library": "2.0.1",
|
"NETStandard.Library": "2.0.3",
|
||||||
"System.Collections.NonGeneric": "4.0.1",
|
"System.Collections.NonGeneric": "4.0.1",
|
||||||
"System.Diagnostics.Process": "4.1.0",
|
"System.Diagnostics.Process": "4.1.0",
|
||||||
"System.Dynamic.Runtime": "4.0.11",
|
"System.Dynamic.Runtime": "4.0.11",
|
||||||
@@ -72,11 +72,11 @@
|
|||||||
"lib/netstandard1.5/MongoDB.Bson.dll": {}
|
"lib/netstandard1.5/MongoDB.Bson.dll": {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"MongoDB.Driver/2.5.0": {
|
"MongoDB.Driver/2.7.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"MongoDB.Bson": "2.5.0",
|
"MongoDB.Bson": "2.7.0",
|
||||||
"MongoDB.Driver.Core": "2.5.0",
|
"MongoDB.Driver.Core": "2.7.0",
|
||||||
"NETStandard.Library": "2.0.1",
|
"NETStandard.Library": "2.0.3",
|
||||||
"System.ComponentModel.TypeConverter": "4.1.0",
|
"System.ComponentModel.TypeConverter": "4.1.0",
|
||||||
"System.Linq.Queryable": "4.0.1"
|
"System.Linq.Queryable": "4.0.1"
|
||||||
},
|
},
|
||||||
@@ -84,11 +84,11 @@
|
|||||||
"lib/netstandard1.5/MongoDB.Driver.dll": {}
|
"lib/netstandard1.5/MongoDB.Driver.dll": {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"MongoDB.Driver.Core/2.5.0": {
|
"MongoDB.Driver.Core/2.7.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"DnsClient": "1.0.7",
|
"DnsClient": "1.0.7",
|
||||||
"MongoDB.Bson": "2.5.0",
|
"MongoDB.Bson": "2.7.0",
|
||||||
"NETStandard.Library": "2.0.1",
|
"NETStandard.Library": "2.0.3",
|
||||||
"System.Collections.Specialized": "4.0.1",
|
"System.Collections.Specialized": "4.0.1",
|
||||||
"System.Diagnostics.TraceSource": "4.0.0",
|
"System.Diagnostics.TraceSource": "4.0.0",
|
||||||
"System.Net.NameResolution": "4.3.0",
|
"System.Net.NameResolution": "4.3.0",
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
"lib/netstandard1.5/MongoDB.Driver.Core.dll": {}
|
"lib/netstandard1.5/MongoDB.Driver.Core.dll": {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"NETStandard.Library/2.0.1": {
|
"NETStandard.Library/2.0.3": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.NETCore.Platforms": "1.1.0"
|
"Microsoft.NETCore.Platforms": "1.1.0"
|
||||||
}
|
}
|
||||||
@@ -926,33 +926,33 @@
|
|||||||
"path": "microsoft.win32.registry/4.0.0",
|
"path": "microsoft.win32.registry/4.0.0",
|
||||||
"hashPath": "microsoft.win32.registry.4.0.0.nupkg.sha512"
|
"hashPath": "microsoft.win32.registry.4.0.0.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"MongoDB.Bson/2.5.0": {
|
"MongoDB.Bson/2.7.0": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
"serviceable": true,
|
"serviceable": true,
|
||||||
"sha512": "sha512-b7zQAUdSdfJ4kmGzAA+hv89N2Q6jm1td9WfTimgp8xWAsN4qbtIjA/JkAY1HA0Z8xfXQE3EmdUcDEwT8bkXfXg==",
|
"sha512": "sha512-vzpTDHYX/X6gF9qtDuKRJiLkqpj5OZuT1bIzJCiBiU8CwJ37becYmaXuy/QSuWnYN6j6ZdVTWILKbWt2MXL8DA==",
|
||||||
"path": "mongodb.bson/2.5.0",
|
"path": "mongodb.bson/2.7.0",
|
||||||
"hashPath": "mongodb.bson.2.5.0.nupkg.sha512"
|
"hashPath": "mongodb.bson.2.7.0.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"MongoDB.Driver/2.5.0": {
|
"MongoDB.Driver/2.7.0": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
"serviceable": true,
|
"serviceable": true,
|
||||||
"sha512": "sha512-VbHVV8Xdl3PcPU3XxdOUE/yc4BnPokg7k1XHU/3fEM/UdfCy0Ie0eXVE+U2HJXVcM3TQuuyVn+B1La2YY7X8dA==",
|
"sha512": "sha512-5wP5BBwm5YO6h2Vhw6zQmOwSW9WP2d6kgRM6E7uIbwIJz4+j2trS2Wo7/+IYow5WVN8Jd6O27bIB/4gKNepO1Q==",
|
||||||
"path": "mongodb.driver/2.5.0",
|
"path": "mongodb.driver/2.7.0",
|
||||||
"hashPath": "mongodb.driver.2.5.0.nupkg.sha512"
|
"hashPath": "mongodb.driver.2.7.0.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"MongoDB.Driver.Core/2.5.0": {
|
"MongoDB.Driver.Core/2.7.0": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
"serviceable": true,
|
"serviceable": true,
|
||||||
"sha512": "sha512-/JYwBTEoWZDHiSePk0AF775c0YkSGSsHTA2+hWt9/UOCkYV/QOFujAWDdpFzBMCDpmQewbLRR1knYj76YOxffA==",
|
"sha512": "sha512-SepB4KT+zXA3iFaIFwXVKmk6BZIp0EGE/iWqNbDZ1mca9e8EhtqYPwOOzFmEbdKAzmVvF1y86kNI4agWP6I5sg==",
|
||||||
"path": "mongodb.driver.core/2.5.0",
|
"path": "mongodb.driver.core/2.7.0",
|
||||||
"hashPath": "mongodb.driver.core.2.5.0.nupkg.sha512"
|
"hashPath": "mongodb.driver.core.2.7.0.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"NETStandard.Library/2.0.1": {
|
"NETStandard.Library/2.0.3": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
"serviceable": true,
|
"serviceable": true,
|
||||||
"sha512": "sha512-oA6nwv9MhEKYvLpjZ0ggSpb1g4CQViDVQjLUcDWg598jtvJbpfeP2reqwI1GLW2TbxC/Ml7xL6BBR1HmKPXlTg==",
|
"sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==",
|
||||||
"path": "netstandard.library/2.0.1",
|
"path": "netstandard.library/2.0.3",
|
||||||
"hashPath": "netstandard.library.2.0.1.nupkg.sha512"
|
"hashPath": "netstandard.library.2.0.3.nupkg.sha512"
|
||||||
},
|
},
|
||||||
"runtime.native.System/4.3.0": {
|
"runtime.native.System/4.3.0": {
|
||||||
"type": "package",
|
"type": "package",
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@@ -6,6 +6,8 @@ https://www.nuget.org/packages/MongoDbGenericRepository/
|
|||||||
|
|
||||||
Covered by 200+ integration tests and counting.
|
Covered by 200+ integration tests and counting.
|
||||||
|
|
||||||
|
The MongoDbGenericRepository is also used in [AspNetCore.Identity.MongoDbCore](https://github.com/alexandre-spieser/AspNetCore.Identity.MongoDbCore).
|
||||||
|
|
||||||
# Usage examples
|
# Usage examples
|
||||||
|
|
||||||
This repository is meant to be inherited from.
|
This repository is meant to be inherited from.
|
||||||
@@ -38,6 +40,7 @@ Here is an example of repository usage, where the TestRepository is implementing
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
## Instantiation
|
## Instantiation
|
||||||
|
|
||||||
The repository can be instantiated like so:
|
The repository can be instantiated like so:
|
||||||
@@ -125,24 +128,33 @@ _testRepository.AddOne(myDoc);
|
|||||||
|
|
||||||
The above code will generate a collection named `myPartitionKey-myPartitionedDocuments`.
|
The above code will generate a collection named `myPartitionKey-myPartitionedDocuments`.
|
||||||
|
|
||||||
|
## CollectionName Attribute
|
||||||
|
It is now possible to change the collection name by using the `CollectionName` attribute:
|
||||||
|
|
||||||
|
```csharp
|
||||||
|
[CollectionName("MyCollectionName")]
|
||||||
|
public class MyDocument : Document
|
||||||
|
{
|
||||||
|
public MyDocument()
|
||||||
|
{
|
||||||
|
Version = 2;
|
||||||
|
}
|
||||||
|
public string SomeContent { get; set; }
|
||||||
|
}
|
||||||
|
```
|
||||||
|
Documents of this type will be inserted into a collection named "MyCollectionName".
|
||||||
|
|
||||||
Please refer to the IntegrationTests (NET45) and CoreIntegrationTests (netstandard2.0) projects for more usage examples.
|
Please refer to the IntegrationTests (NET45) and CoreIntegrationTests (netstandard2.0) projects for more usage examples.
|
||||||
|
|
||||||
## Author
|
## Author
|
||||||
**Alexandre Spieser**
|
**Alexandre Spieser**
|
||||||
|
|
||||||
## Donations
|
|
||||||
Feeling like my work is worth a coffee?
|
|
||||||
Donations are welcome and will go towards further development of this project as well as other MongoDb related projects. Use the wallet address below to donate.
|
|
||||||
BTC Donations: 1FDMWqSK8SHXDGKKp7gyZc4rknynWJ7qbj
|
|
||||||
|
|
||||||
*Thank you for your support and generosity!*
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
mongodb-generic-repository is under MIT license - http://www.opensource.org/licenses/mit-license.php
|
mongodb-generic-repository is under MIT license - http://www.opensource.org/licenses/mit-license.php
|
||||||
|
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2016-2017 Alexandre Spieser
|
Copyright (c) 2016-2018 Alexandre Spieser
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
@@ -177,4 +189,4 @@ Copyright (c) 2012-2014 Mehdi Khalili (http://omar.io)
|
|||||||
==============================================================================
|
==============================================================================
|
||||||
|
|
||||||
## Copyright
|
## Copyright
|
||||||
Copyright © 2017
|
Copyright © 2018
|
||||||
|
|||||||
Reference in New Issue
Block a user