# hazzik/delegatedecompiler architecture

> Architecture diagram of the GitHub repository hazzik/delegatedecompiler, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/hazzik/delegatedecompiler
- Repository: https://github.com/hazzik/delegatedecompiler

## Overview

DelegateDecompiler turns compiled delegate or method bodies—especially computed properties and methods—into expression trees that LINQ providers can translate. The main workflow is to mark or explicitly select a computed member, decompile the query before materialization, and pass the rewritten expression to the underlying provider; EF6 and EF Core integrations add async and automatic-decompilation paths. The core reconstruction layer uses IL processors and control-flow support to build expressions, with visitors for decompilation and optimization. The supplied excerpts do not show every internal call, so uncertain links are omitted.

Main entry points: [`src/DelegateDecompiler/DecompiledQueryProvider.cs`](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/DecompiledQueryProvider.cs) (Query provider), [`src/DelegateDecompiler.EntityFramework/AsyncDecompiledQueryProvider.cs`](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler.EntityFramework/AsyncDecompiledQueryProvider.cs) (EF6 async adapter), [`src/DelegateDecompiler.EntityFrameworkCore5/DelegateDecompileEntityQueryProvider.cs`](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler.EntityFrameworkCore5/DelegateDecompileEntityQueryProvider.cs) (EF Core provider), [`src/DelegateDecompiler/DecompileExpressionVisitor.cs`](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/DecompileExpressionVisitor.cs) (Decompile visitor)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_core["Expression decompilation"]
  node_computed["Computed markers"]
  node_config["Decompiler config<br/>[Configuration.cs]"]
  node_entry["Decompile extensions"]
  node_visitor["Decompile visitor"]
  node_body["Method body reader"]
  node_processor["IL processor<br/>[Processor.cs]"]
  node_opprocessors["Opcode processors<br/>[CallProcessor.cs]"]
  node_cfg["Control-flow builder"]
  node_optimizer["Expression optimizer"]
end

subgraph group_query["LINQ query integration"]
  node_queryext["Queryable extensions"]
  node_provider["Query provider"]
  node_queryable["Queryable wrapper"]
end

subgraph group_orm["ORM adapters"]
  node_ef6["EF6 async adapter"]
  node_ef6query["EF6 query wrapper"]
  node_ef6ext["EF6 extensions"]
  node_efcore["EF Core provider"]
  node_efcoreext["EF Core options"]
end

node_developer(("Application code"))
node_ormquery["ORM query source"]
node_database[("ORM database")]

node_developer -->|"marks members"| node_computed
node_developer -->|"configures"| node_config
node_developer -->|"calls before materializing"| node_queryext
node_queryext -->|"wraps query"| node_provider
node_provider -->|"decompiles expression"| node_visitor
node_visitor -->|"reads method body"| node_body
node_body -->|"processes IL"| node_processor
node_processor -->|"dispatches opcodes"| node_opprocessors
node_body -->|"uses control flow"| node_cfg
node_provider -->|"optimizes expression"| node_optimizer
node_provider -->|"forwards rewritten query"| node_ormquery
node_provider -->|"creates wrapper"| node_queryable
node_queryable -->|"enumerates"| node_ormquery
node_developer -.->|"uses async extension"| node_ef6ext
node_ef6ext -->|"wraps provider"| node_ef6
node_ef6 -->|"decompiles expression"| node_visitor
node_ef6 -->|"executes asynchronously"| node_ormquery
node_ef6 -->|"creates wrapper"| node_ef6query
node_ef6query -->|"enumerates asynchronously"| node_ormquery
node_developer -.->|"enables automatic decompilation"| node_efcoreext
node_efcoreext -->|"installs provider"| node_efcore
node_efcore -->|"decompiles expression"| node_visitor
node_efcore -->|"optimizes expression"| node_optimizer
node_efcore -->|"executes query"| node_database
node_ormquery -->|"executes query"| node_database

click node_computed "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/ComputedAttribute.cs"
click node_config "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/Configuration.cs"
click node_entry "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/DecompileExtensions.cs"
click node_visitor "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/DecompileExpressionVisitor.cs"
click node_body "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/MethodBodyDecompiler.cs"
click node_processor "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/Processor.cs"
click node_opprocessors "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/Processors/CallProcessor.cs"
click node_cfg "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/ControlFlow/ControlFlowGraphBuilder.cs"
click node_optimizer "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/OptimizeExpressionVisitor.cs"
click node_queryext "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/DecompileExtensions.cs"
click node_provider "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/DecompiledQueryProvider.cs"
click node_queryable "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/DecompiledQueryable.cs"
click node_ef6 "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler.EntityFramework/AsyncDecompiledQueryProvider.cs"
click node_ef6query "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler.EntityFramework/AsyncDecompiledQueryable.cs"
click node_ef6ext "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler.EntityFramework/DecompileExtensions.cs"
click node_efcore "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler.EntityFrameworkCore5/DelegateDecompileEntityQueryProvider.cs"
click node_efcoreext "https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler.EntityFrameworkCore5/DbContextOptionsBuilderExtensions.cs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_computed,node_config,node_entry,node_visitor,node_body,node_processor,node_opprocessors,node_cfg,node_optimizer toneBlue
class node_queryext,node_provider,node_queryable,node_database toneAmber
class node_ef6,node_ef6query,node_ef6ext,node_efcore,node_efcoreext toneMint
class node_developer,node_ormquery toneIndigo
```

## Components

### Expression decompilation

- [Computed markers](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/ComputedAttribute.cs): `src/DelegateDecompiler/ComputedAttribute.cs`
- [Decompiler config](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/Configuration.cs): `src/DelegateDecompiler/Configuration.cs`
- [Decompile extensions](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/DecompileExtensions.cs): `src/DelegateDecompiler/DecompileExtensions.cs`
- [Decompile visitor](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/DecompileExpressionVisitor.cs): `src/DelegateDecompiler/DecompileExpressionVisitor.cs`
- [Method body reader](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/MethodBodyDecompiler.cs): `src/DelegateDecompiler/MethodBodyDecompiler.cs`
- [IL processor](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/Processor.cs): `src/DelegateDecompiler/Processor.cs`
- [Opcode processors](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/Processors/CallProcessor.cs): `src/DelegateDecompiler/Processors/CallProcessor.cs`
- [Control-flow builder](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/ControlFlow/ControlFlowGraphBuilder.cs): `src/DelegateDecompiler/ControlFlow/ControlFlowGraphBuilder.cs`
- [Expression optimizer](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/OptimizeExpressionVisitor.cs): `src/DelegateDecompiler/OptimizeExpressionVisitor.cs`

### LINQ query integration

- [Queryable extensions](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/DecompileExtensions.cs): `src/DelegateDecompiler/DecompileExtensions.cs`
- [Query provider](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/DecompiledQueryProvider.cs): `src/DelegateDecompiler/DecompiledQueryProvider.cs`
- [Queryable wrapper](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler/DecompiledQueryable.cs): `src/DelegateDecompiler/DecompiledQueryable.cs`

### ORM adapters

- [EF6 async adapter](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler.EntityFramework/AsyncDecompiledQueryProvider.cs): `src/DelegateDecompiler.EntityFramework/AsyncDecompiledQueryProvider.cs`
- [EF6 query wrapper](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler.EntityFramework/AsyncDecompiledQueryable.cs): `src/DelegateDecompiler.EntityFramework/AsyncDecompiledQueryable.cs`
- [EF6 extensions](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler.EntityFramework/DecompileExtensions.cs): `src/DelegateDecompiler.EntityFramework/DecompileExtensions.cs`
- [EF Core provider](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler.EntityFrameworkCore5/DelegateDecompileEntityQueryProvider.cs): `src/DelegateDecompiler.EntityFrameworkCore5/DelegateDecompileEntityQueryProvider.cs`
- [EF Core options](https://github.com/hazzik/delegatedecompiler/blob/main/src/DelegateDecompiler.EntityFrameworkCore5/DbContextOptionsBuilderExtensions.cs): `src/DelegateDecompiler.EntityFrameworkCore5/DbContextOptionsBuilderExtensions.cs`

### Other components

- **Application code**
- **ORM query source**
- **ORM database**

## Connections

- Application code → Computed markers: marks members
- Application code → Decompiler config: configures
- Application code → Queryable extensions: calls before materializing
- Queryable extensions → Query provider: wraps query
- Query provider → Decompile visitor: decompiles expression
- Decompile visitor → Method body reader: reads method body
- Method body reader → IL processor: processes IL
- IL processor → Opcode processors: dispatches opcodes
- Method body reader → Control-flow builder: uses control flow
- Query provider → Expression optimizer: optimizes expression
- Query provider → ORM query source: forwards rewritten query
- Query provider → Queryable wrapper: creates wrapper
- Queryable wrapper → ORM query source: enumerates
- Application code → EF6 extensions: uses async extension
- EF6 extensions → EF6 async adapter: wraps provider
- EF6 async adapter → Decompile visitor: decompiles expression
- EF6 async adapter → ORM query source: executes asynchronously
- EF6 async adapter → EF6 query wrapper: creates wrapper
- EF6 query wrapper → ORM query source: enumerates asynchronously
- Application code → EF Core options: enables automatic decompilation
- EF Core options → EF Core provider: installs provider
- EF Core provider → Decompile visitor: decompiles expression
- EF Core provider → Expression optimizer: optimizes expression
- EF Core provider → ORM database: executes query
- ORM query source → ORM database: executes query
