EFCore.Kusto
0.2.4
dotnet add package EFCore.Kusto --version 0.2.4
NuGet\Install-Package EFCore.Kusto -Version 0.2.4
<PackageReference Include="EFCore.Kusto" Version="0.2.4" />
<PackageVersion Include="EFCore.Kusto" Version="0.2.4" />
<PackageReference Include="EFCore.Kusto" />
paket add EFCore.Kusto --version 0.2.4
#r "nuget: EFCore.Kusto, 0.2.4"
#:package EFCore.Kusto@0.2.4
#addin nuget:?package=EFCore.Kusto&version=0.2.4
#tool nuget:?package=EFCore.Kusto&version=0.2.4
EFCore.Kusto
A lightweight, extensible Entity Framework Core provider for translating LINQ queries into Kusto Query Language (KQL) AKA Azure Data Explorer (ADX).
While I primarily built this to integrate with ASP.NET Core OData (v8+) for analytical workloads, it can be used standalone for any LINQ-to-KQL translation needs.
Table of Contents
- 1. Installation
- 2. Getting Started
- 3. Project Goals
- 4. Read Capabilities
- 5. Write Capabilities
- 6. Migrations (Experimental)
- 7. Changelog
- 8. Contributing
- 9. License
- 10. Disclaimer
1. Installation
Install the package from NuGet:
dotnet add package EFCore.Kusto
Or via csproj:
<ProjectReference Include="src/EFCore.Kusto/EFCore.Kusto.csproj" />
2. Getting Started
Register your DbContext with the Kusto provider and pick an authentication option:
builder.Services.AddDbContext<PropertyContext>((sp, options) => { options.UseKusto( clusterUrl: "https://<cluster>.kusto.windows.net", database: "<database>", kusto => kusto.UseManagedIdentity()); });- Use
UseManagedIdentity(clientId)for a user-assigned identity, or omit the client id for system-assigned identities. - Use
UseApplicationAuthentication(tenantId, clientId, clientSecret)for app registrations. - Use
UseTokenCredential(credential)to supply anyTokenCredential(e.g., one registered viaAddKustoManagedIdentityCredentialorAddKustoApplicationRegistration). - If no authentication option is configured, the provider falls back to
DefaultAzureCredentialwhen executing queries.
- Use
Optional: register shared credentials so they can be reused when building
DbContextoptions:builder.Services.AddKustoManagedIdentityCredential(clientId: "<client-id>"); // or builder.Services.AddKustoApplicationRegistration( tenantId: "<tenant-id>", clientId: "<client-id>", clientSecret: "<client-secret>");These helpers register a singleton
TokenCredentialyou can inject when callingUseTokenCredentialinsideAddDbContext.
3. Project Goals
- Provide a reliable LINQ-to-KQL translation layer.
- Integrate cleanly with ASP.NET Core OData (v8+).
- Offer predictable, debuggable SQL generation.
- Ensure correctness and performance for high‑volume analytical datasets.
- Remain lightweight with minimal runtime overhead.
4. Read Capabilities
Query Translation
This provider currently supports:
WherefiltersSelectprojections- Ordering (
OrderBy,ThenBy) - Pagination (
Skip,Take) GroupBywith aggregates (Sum,Min,Max,Average,Count,LongCount,Count(predicate)→countif,Distinct().Count()→dcount)- Conditional expressions (
?:) →iif/case - Basic join translation used by OData
$expand - Counts as used by OData
$count
OData Compatibility
EFCore.Kusto works well with:
$filter$select$orderby$count$skip,$top$expand(entity relationships)
If specific OData query shapes cause issues, they can be addressed case‑by‑case. Community reports are welcome.
5. Write Capabilities
EFCore.Kusto supports data modification using Kusto-native control commands.
Supported Operations
- Insert (
Add,AddRange) via.ingest - Update (
Update) via.update table - Delete (
Remove,RemoveRange) via.delete table
Batching Semantics
- Commands are batched per entity type and target table
- Read and write operations are never mixed in the same batch
- Each batch is executed as a single Kusto command
Note: Transactional guarantees and concurrency semantics are constrained by Kusto’s execution model.
6. Migrations (Experimental)
EF Core migrations are supported, translating schema operations into KQL control commands
(.create-merge table, .alter-merge table, .drop, .rename, etc.). Standard tooling works:
dotnet ef migrations add, dotnet ef database update, dotnet ef migrations script. Applied
migrations are tracked in an EFMigrationsHistory table.
Migrations run against the database selected by UseKusto(cluster, database) — Kusto's database
is the schema equivalent and is fixed at the connection, so EF schema operations are no-ops.
This feature is experimental. Limitations:
- Indexes, foreign keys, primary keys, unique/check constraints, and sequences are no-ops (Kusto has none).
- Migrations are non-transactional — no rollback; execution stops at the first failing command.
.alter column type=clears existing data in that column (Kusto semantics).
7. Changelog
See CHANGELOG.md for a detailed version history.
8. Contributing
Contributions are welcome.
If you encounter a translation issue, please include:
- The LINQ expression (or OData URL if applicable).
- The expected KQL.
- The generated KQL (if available).
This helps isolate translation gaps quickly.
9. License
MIT License – simple, permissive, widely accepted.
EFCore.Kusto is free for commercial and open‑source use.
10. Disclaimer
While this provider is functional and under active development, it is not yet battle-tested in production environments.
If you encounter unexpected behavior, open an issue — the goal is full reliability for production workloads.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. 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. |
-
net8.0
- Azure.Identity (>= 1.13.0)
- Microsoft.Azure.Kusto.Data (>= 14.0.2)
- Microsoft.EntityFrameworkCore (>= 8.0.8)
- Microsoft.EntityFrameworkCore.Relational (>= 8.0.8)
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 |
|---|---|---|
| 0.2.4 | 106 | 6/1/2026 |
| 0.2.3 | 112 | 5/25/2026 |
| 0.2.2 | 107 | 5/8/2026 |
| 0.2.1 | 286 | 3/11/2026 |
| 0.2.0 | 157 | 1/30/2026 |
| 0.1.9 | 121 | 1/28/2026 |
| 0.1.8 | 128 | 1/23/2026 |
| 0.1.7 | 134 | 1/18/2026 |
| 0.1.6 | 138 | 1/9/2026 |
| 0.1.5 | 221 | 12/23/2025 |
| 0.1.4 | 218 | 12/22/2025 |
| 0.1.3 | 266 | 12/19/2025 |
| 0.1.2 | 305 | 12/18/2025 |
| 0.1.1.1 | 260 | 12/19/2025 |
| 0.1.0 | 235 | 11/23/2025 |
Version 0.2.4:
- Added experimental EF Core migrations support (schema ops -> KQL control commands, EFMigrationsHistory tracking). Non-transactional; alter-column-type clears data; relational-only constructs are no-ops.
Version 0.2.3:
- Added GroupBy -> KQL summarize translation (Sum/Min/Max/Avg/Count/LongCount, countif, dcount).
- Added conditional (?:) translation to iif / case.
- Fixed parameter substitution to emit typed KQL literals (was using raw ToString).
Version 0.2.2:
- Fixed duplicate parameter issue.
Version 0.2.1:
- Convert from Hex string for byte arrays.
Version 0.2.0:
- Added support for `Any()` translation.
Version 0.1.9:
- Added support for OUTER APPLY and CROSS APPLY.
Version 0.1.8:
- Fixed inequality comparisons on strings.
Version 0.1.7:
- Fixed `not` operator translation
- Fixed duplicate column issue in joins
- Implemented `Contains`
Version 0.1.6:
- Fixed NULL handling in PATCH requests.
- Better string escaping in PATCH requests.
Version 0.1.5:
- Optimized `.update` command to use less nesting and support larger batches.
Version 0.1.4:
- Fixed `COUNT(*)` regression resulting from `KustoQuerySqlGenerator.WriteProjection` refactor.
Version 0.1.3:
- Added support for `DateOnly` type translation.
Version 0.1.2:
- Added write command batching per entity/table.
Version 0.1.1:
- Added update support via Kusto `.update table` commands.
Version 0.1.0:
- Initial release (read-only query support).