DataFuse is a declarative framework that aggregates data from SQL databases, REST APIs, and any heterogeneous datsource into unified, strongly-typed objects — replacing hundreds of lines of manual orchestration code with clean, schema-driven configuration.
Building a product page? You need inventory from SQL Server, pricing from a REST API, and reviews from MongoDB. That's 50+ lines of manual fetch-assemble code — sequential, tightly coupled, and repeated across your codebase.
// Without DataFuse: manual orchestration everywherevarproduct=awaitdb.QueryFirstAsync<ProductRecord>("SELECT * FROM Products WHERE Id = @Id",new{Id=productId});varpricing=awaithttpClient.GetFromJsonAsync<PricingResponse>($"https://pricing-api/products/{productId}");varreviews=awaithttpClient.GetFromJsonAsync<ReviewResponse[]>($"https://reviews-api/products/{productId}");product.Price=pricing.Price;product.Reviews=reviews.Select(r =>newReview{Rating=r.Stars,Comment=r.Text}).ToArray();// With DataFuse: declare once, use everywherevarproduct=dataProvider.GetData(newProductRequest{ProductId=42});DataFuse automatically executes the SQL query first, then runs pricing and reviews API calls in parallel, passes parent results to child queries, and assembles the final typed object.
dotnet add package DataFuse.Integration
dotnet add package DataFuse.Adapters.SQL # SQL with Dapper
dotnet add package DataFuse.Adapters.WebAPI # REST APIs
dotnet add package DataFuse.Adapters.MongoDB # MongoDBpublicclassProduct:IEntity{publicintProductId{get;set;}publicstringName{get;set;}publicdecimalPrice{get;set;}publicdecimalDiscount{get;set;}publicReview[]Reviews{get;set;}}// SQL query — fetches product from databasepublicclassProductQuery:SQLQuery<ProductResult>{protectedoverrideFunc<IDbConnection,Task<ProductResult>>GetQuery(IDataContextcontext,IQueryResultparentQueryResult){varrequest=(ProductRequest)context.Request;return connection =>connection.QueryFirstOrDefaultAsync<ProductResult>("SELECT ProductId as Id, Name, Price FROM Products WHERE ProductId = @Id",new{Id=request.ProductId});}}// MongoDB query — fetches reviews from MongoDB, receives parent resultpublicclassReviewsMongoQuery:MongoQuery<CollectionResult<ReviewResult>>{protectedoverrideFunc<IMongoDatabase,Task<CollectionResult<ReviewResult>>>GetQuery(IDataContextcontext,IQueryResult?parentQueryResult){varproduct=(ProductResult)parentQueryResult;returnasync database =>{varcollection=database.GetCollection<ReviewResult>("reviews");varreviews=awaitcollection.Find(r =>r.ProductId==product.Id).ToListAsync();returnnewCollectionResult<ReviewResult>(reviews);};}}// API query — fetches live pricing from external service, receives parent resultpublicclassPricingApiQuery:WebQuery<PricingResult>{publicPricingApiQuery():base("https://api.pricing.com/"){}protectedoverrideFunc<Uri>GetQuery(IDataContextcontext,IQueryResultparentQueryResult){varproduct=(ProductResult)parentQueryResult;return()=>newUri($"products/{product.Id}/pricing",UriKind.Relative);}}publicclassProductTransform:BaseTransformer<ProductResult,Product>{publicoverridevoidTransform(ProductResultqueryResult,Productentity){entity.ProductId=queryResult.Id;entity.Name=queryResult.Name;entity.Price=queryResult.Price;}}publicclassPricingTransform:BaseTransformer<PricingResult,Product>{publicoverridevoidTransform(PricingResultqueryResult,Productentity){entity.Price=queryResult.CurrentPrice;entity.Discount=queryResult.DiscountPercent;}}publicclassReviewsTransform:BaseTransformer<CollectionResult<ReviewResult>,Product>{publicoverridevoidTransform(CollectionResult<ReviewResult>queryResult,Productentity){entity.Reviews=queryResult?.Select(r =>newReview{ReviewId=r.Id,Comment=r.Comment,Rating=r.Rating}).ToArray()??Array.Empty<Review>();}}publicclassProductConfiguration:EntityConfiguration<Product>{publicoverrideIEnumerable<Mapping<Product,IQueryResult>>GetSchema(){returnCreateSchema.For<Product>().Map<ProductQuery,ProductTransform>(For.Paths("product"),
product =>product.Dependents.Map<PricingApiQuery,PricingTransform>(For.Paths("product/pricing")).Map<ReviewsMongoQuery,ReviewsTransform>(For.Paths("product/reviews"))).End();}}// DI registrationservices.UseDataFuse().WithEngine(c =>newQueryEngine(sqlConfiguration))// SQL.WithEngine<DataFuse.Adapters.WebAPI.QueryEngine>()// REST API.WithEngine(c =>newDataFuse.Adapters.MongoDB.QueryEngine(mongoDatabase))// MongoDB.WithPathMatcher(c =>newXPathMatcher()).WithEntityConfiguration<Product>(c =>newProductConfiguration());services.AddHttpClient();// Usage — one line to get fully hydrated datapublicclassProductService{privatereadonlyIDataProvider<Product>_dataProvider;publicProductService(IDataProvider<Product>dataProvider)=>_dataProvider=dataProvider;publicProductGetProduct(intproductId)=>_dataProvider.GetData(newProductRequest{ProductId=productId});// Selective loading — only fetch product + reviews, skip other pathspublicProductGetProductWithReviews(intproductId)=>_dataProvider.GetData(newProductRequest{ProductId=productId,SchemaPaths=new[]{"product","product/reviews"}});}| Feature | Description |
|---|---|
| Declarative Schema | Define data relationships once with fluent configuration |
| Automatic Parallelism | Sibling queries run in parallel — no Task.WhenAll boilerplate |
| Selective Loading | Fetch only the data paths the consumer needs via SchemaPaths |
| Parent-Child Dependencies | Parent results flow to child queries automatically |
| Cross-Source Mixing | Combine SQL + REST API + MongoDB + EF Core queries in one entity |
| Type Safety | Strongly-typed queries, results, and transformers |
| Built-in Caching | [CacheResult] attribute for expensive query results |
| Custom Adapters | Add any data source by implementing IQueryEngine |
| Package | Purpose | Install |
|---|---|---|
| DataFuse.Integration | Core orchestration, DI, helpers | dotnet add package DataFuse.Integration |
| DataFuse.Adapters.SQL | SQL via Dapper | dotnet add package DataFuse.Adapters.SQL |
| DataFuse.Adapters.EntityFramework | EF Core | dotnet add package DataFuse.Adapters.EntityFramework |
| DataFuse.Adapters.WebAPI | REST APIs via HttpClient | dotnet add package DataFuse.Adapters.WebAPI |
| DataFuse.Adapters.MongoDB | MongoDB via official driver | dotnet add package DataFuse.Adapters.MongoDB |
| DataFuse.Adapters.Abstraction | Interfaces & base classes | Included as dependency |
| Package | .NET | .NET Standard | .NET Framework |
|---|---|---|---|
| DataFuse.Integration | 8.0, 9.0, 10.0 | 2.1 | - |
| DataFuse.Adapters.Abstraction | 8.0, 9.0, 10.0 | 2.1 | - |
| DataFuse.Adapters.SQL | 8.0, 9.0, 10.0 | 2.1 | - |
| DataFuse.Adapters.WebAPI | 8.0, 9.0, 10.0 | 2.1 | - |
| DataFuse.Adapters.MongoDB | 8.0, 9.0, 10.0 | 2.1 | - |
| DataFuse.Adapters.EntityFramework | 10.0 | - | - |
See the Complete Developer Guide for detailed documentation including:
- Real-world use cases (e-commerce, customer 360, reporting)
- Core concepts deep dive
- Query implementation guides (SQL, EF Core, Web API, MongoDB)
- Transformer patterns
- Advanced features (caching, selective loading, custom engines)
- Architecture overview
If you are having problems, please let us know by raising a new issue.
This project is licensed with the MIT license.
The main branch is now on .NET 10.0. Previous versions:
| Version | Release Notes | Developer Guide |
|---|---|---|
v3.0.0 | Notes | Guide |
v2.0.0 | Notes | Guide |
v1.0.0 | Notes | Guide |
