eQuantic.Core.Data.MongoDb
5.3.0
dotnet add package eQuantic.Core.Data.MongoDb --version 5.3.0
NuGet\Install-Package eQuantic.Core.Data.MongoDb -Version 5.3.0
<PackageReference Include="eQuantic.Core.Data.MongoDb" Version="5.3.0" />
<PackageVersion Include="eQuantic.Core.Data.MongoDb" Version="5.3.0" />
<PackageReference Include="eQuantic.Core.Data.MongoDb" />
paket add eQuantic.Core.Data.MongoDb --version 5.3.0
#r "nuget: eQuantic.Core.Data.MongoDb, 5.3.0"
#:package eQuantic.Core.Data.MongoDb@5.3.0
#addin nuget:?package=eQuantic.Core.Data.MongoDb&version=5.3.0
#tool nuget:?package=eQuantic.Core.Data.MongoDb&version=5.3.0
eQuantic.Core.Data
A provider-agnostic Repository + Unit of Work for .NET, where filtering, sorting and paging are authored typed and fluent — not as stringly-typed configuration.
var repo = unitOfWork.GetAsyncRepository<OrderData, Guid>();
var page = await repo.GetPagedAsync(
PageRequest.Of(pageIndex: 1, pageSize: 20),
new QueryOptions<OrderData>()
.Where(o => o.Total, FilterOperator.GreaterThan, 100m)
.And(o => o.Customer.Name, FilterOperator.Contains, term)
.OrderByDescending(o => o.CreatedAt)
.Include(nameof(OrderData.Customer))
.NoTracking());
// page is a PagedResult<OrderData>: Items + TotalCount + PageIndex/PageSize/PageCount + Has*Page
Why
The Repository pattern keeps your domain ignorant of the persistence engine — you code against
IRepository<TEntity, TKey>, and the Entity Framework (or other) provider supplies the
implementation. What usually rots is the query surface: dozens of GetPaged/GetFiltered
overloads and Action<Configuration> callbacks, with filters and sorts passed as magic strings.
eQuantic.Core.Data v5 collapses that: one method per operation, each taking a single
QueryOptions<TEntity> that you compose fluently and typed, backed by the
eQuantic.Linq query engine.
Getting started
This package is the contracts — pair it with a provider that supplies the engine:
dotnet add package eQuantic.Core.Data
dotnet add package eQuantic.Core.Data.EntityFramework.SqlServer # or PostgreSql / MySql / MongoDb / CosmosDb
Give your entities a key via IEntity<TKey> (the key is exposed through GetKey/SetKey — no mandated
Id property):
using eQuantic.Core.Data.Repository;
public class OrderData : IEntity<Guid>
{
public Guid Id { get; set; }
public decimal Total { get; set; }
public Guid GetKey() => Id;
public void SetKey(Guid key) => Id = key;
}
Register the provider's unit of work and repositories — the wiring is provider-specific (see the
Entity Framework Core provider) — then inject
IUnitOfWork, ask it for a repository, and query with a QueryOptions (the snippet at the top).
How you query
QueryOptions<TEntity> mirrors the eQuantic.Linq query builders, so filters read like code and
fail at compile time — not at runtime:
new QueryOptions<OrderData>()
.Where(o => o.Total, FilterOperator.GreaterThanOrEqual, 100m) // typed member selector
.And(o => o.Status, FilterOperator.Equal, OrderStatus.Paid) // clauses fold left to right:
.Or(o => o.Customer.IsVip, FilterOperator.Equal, true) // (total>=100 AND paid) OR vip
.OrderByDescending(o => o.CreatedAt)
.ThenBy("customer.name"); // string path for dynamic columns
You reach for whichever filter form fits — all end up as one predicate the provider translates:
| Form | When |
|---|---|
Where(selector, op, value) / And / Or |
Primary — typed, fluent, compile-checked. |
Where(string path, op, value) |
Dynamic column names; operator and value stay typed. |
Where(ISpecification<T>) |
A reusable domain rule (specification pattern). |
Where(Expression<Func<T, bool>>) |
An arbitrary predicate you already hold. |
Where(ExpressionModel<T>) |
A serialized filter — built in code or received over the wire. |
Where("total:gt(100)") |
The boundary where a filter arrives as a query string (e.g. a filterBy parameter). Prefer the typed form in code. |
The query-string grammar behind the string forms (total:gt(100),status:eq(Paid)) is documented in
the eQuantic.Linq query-string reference.
Paging that tells you what you got
PagedResult<OrderData> page = await repo.GetPagedAsync(PageRequest.Of(2, 20), options);
// page.Items, page.TotalCount, page.PageIndex, page.PageSize, page.PageCount,
// page.HasPreviousPage, page.HasNextPage
PageRequest is one-based (Skip/Take derived); PagedResult<T> carries the items and the
totals — no second count call, no bare IEnumerable<T>.
Provider-agnostic by design
This package is the contracts (IRepository, IUnitOfWork, QueryOptions, PageRequest,
PagedResult, specifications). The persistence engine is kept out of the type signatures —
IRepository<TEntity, TKey>, not IRepository<TUnitOfWork, TEntity, TKey>. The Entity Framework
implementation lives in the provider packages (eQuantic.Core.Data.EntityFramework and friends).
Native document-store provider (MongoDB)
eQuantic.Core.Data.MongoDb implements the same contracts directly on the MongoDB driver — no
Entity Framework. The write model is lean: Add/Modify/Remove buffer typed write models and a
single ordered bulk write runs on Commit (no change tracking or snapshotting); explicit multi-document
transactions are opt-in. It also brings what EF's document support cannot — fluent, typed migrations
for a document store, authored with member selectors instead of field strings:
services.AddMongoRepositories("mongodb://localhost:27017", "shop");
services.AddMongoMigrations(typeof(AddProductIndexes).Assembly);
[Migration("Product indexes", 2026, 7, 20, 14, 0, 0)]
public sealed class AddProductIndexes : Migration
{
public override void Up(IMigrationBuilder migration) =>
migration.For<Product>(product => product
.EnsureCollection()
.Index(x => x.Category)
.CompositeIndex(keys => keys.Descending(x => x.Price).Ascending(x => x.Name)));
}
// on startup: apply pending migrations, once each
await serviceProvider.GetRequiredService<IMigrationRunner>().RunAsync();
Targets net10.0. Set-based UpdateMany(filter, x => new Product { Status = "Closed" }) translates the
member-init to a $set, honouring [BsonElement]/[BsonRepresentation] and custom serializers.
Install
dotnet add package eQuantic.Core.Data
Targets net8.0 and net10.0. Depends only on the framework-free
eQuantic.Linq.Web and
eQuantic.Linq.Specification.
Learn more
- Repository Pattern walkthrough — a full example: data entities, unit of work, repository, specifications and domain services.
- v5 contracts design — the rationale, the consolidated interface and the breaking-change/migration summary.
- Releasing — the automated release flow (maintainers).
Upgrading to v5
v5 is a deliberate breaking redesign: one QueryOptions argument per read (not
Action<Configuration> + overloads), PagedResult<T> paging, the unit-of-work type parameter
removed from IRepository/GetRepository, an IEntity<TKey> constraint (no new()), the
SQL/relational surface moved to the provider layer, and the monolithic eQuantic.Linq dependency
replaced by eQuantic.Linq.Web + eQuantic.Linq.Specification. The full before/after is in the
design doc.
MIT © eQuantic Tech
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- eQuantic.Core.Data (>= 5.3.0)
- eQuantic.Linq.Expressions (>= 3.7.0)
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 10.0.0)
- MongoDB.Driver (>= 3.10.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 5.3.0 | 0 | 7/20/2026 |
| 5.2.0 | 5 | 7/20/2026 |
| 1.1.1 | 427 | 4/17/2024 |
| 1.1.0 | 474 | 2/12/2024 |
| 1.1.0-beta7 | 204 | 2/12/2024 |
| 1.1.0-beta6 | 239 | 1/19/2024 |
| 1.1.0-beta5 | 208 | 1/19/2024 |
| 1.1.0-beta4 | 208 | 1/17/2024 |
| 1.1.0-beta3 | 301 | 12/21/2023 |
| 1.1.0-beta2 | 210 | 12/21/2023 |
| 1.1.0-beta1 | 219 | 12/19/2023 |
| 1.0.0.3-beta6 | 651 | 7/5/2020 |
| 1.0.0.2-beta6 | 602 | 6/7/2020 |
| 1.0.0.1-beta6 | 627 | 6/7/2020 |
| 1.0.0.1-beta5 | 566 | 5/19/2020 |
| 1.0.0.1-beta4 | 584 | 5/16/2020 |
| 1.0.0.1-beta3 | 682 | 12/27/2019 |
| 1.0.0.1-beta2 | 576 | 12/25/2019 |
| 1.0.0.1-beta1 | 579 | 12/25/2019 |
Native MongoDB Driver implementation of the eQuantic.Core.Data contracts