AutoMapper.AspNetCore.OData.EFCore 9.0.0

Prefix Reserved
dotnet add package AutoMapper.AspNetCore.OData.EFCore --version 9.0.0
                    
NuGet\Install-Package AutoMapper.AspNetCore.OData.EFCore -Version 9.0.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="AutoMapper.AspNetCore.OData.EFCore" Version="9.0.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="AutoMapper.AspNetCore.OData.EFCore" Version="9.0.0" />
                    
Directory.Packages.props
<PackageReference Include="AutoMapper.AspNetCore.OData.EFCore" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add AutoMapper.AspNetCore.OData.EFCore --version 9.0.0
                    
#r "nuget: AutoMapper.AspNetCore.OData.EFCore, 9.0.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package AutoMapper.AspNetCore.OData.EFCore@9.0.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=AutoMapper.AspNetCore.OData.EFCore&version=9.0.0
                    
Install as a Cake Addin
#tool nuget:?package=AutoMapper.AspNetCore.OData.EFCore&version=9.0.0
                    
Install as a Cake Tool

AutoMapper.Extensions.OData

Creates LINQ expressions from ODataQueryOptions and executes the query.

NuGet Package Downloads

NuGet
NuGet
NuGet

Usage

To use:

  • Configure object maps with explicit expansion.
  • Call the GetAsync or GetQueryAsync extension method from your OData controller. IMapper is an AutoMapper interface.
    public class CoreBuildingMappings : AutoMapper.Profile
    {
        public CoreBuildingMappings()
        {
            CreateMap<TBuilding, CoreBuilding>()
                .ForMember(d => d.Name, o => o.MapFrom(s => s.LongName))
                .ForMember(d => d.Tenant, o => o.MapFrom(s => s.Mandator))
                .ForAllMembers(o => o.ExplicitExpansion());

            CreateMap<TBuilder, OpsBuilder>()
                .ForAllMembers(o => o.ExplicitExpansion());
            CreateMap<TCity, OpsCity>()
                .ForAllMembers(o => o.ExplicitExpansion());
        }
    }
public static async Task<ICollection<TModel>> GetAsync<TModel, TData>(this IQueryable<TData> query, IMapper mapper, ODataQueryOptions<TModel> options, HandleNullPropagationOption handleNullPropagation = HandleNullPropagationOption.Default);
public static async Task<IQueryable<TModel>> GetQueryAsync<TModel, TData>(this IQueryable<TData> query, IMapper mapper, ODataQueryOptions<TModel> options, HandleNullPropagationOption handleNullPropagation = HandleNullPropagationOption.Default);
    public class CoreBuildingController : ODataController
    {

	private readonly IMapper _mapper;
        public CoreBuildingController(MyDbContext context, IMapper mapper)
        {
            Context = context;
            _mapper = mapper;
        }

        MyDbContext Context { get; set; }

        [HttpGet]
        public async Task<IActionResult> Get(ODataQueryOptions<CoreBuilding> options)
        {
            return Ok(await Context.BuildingSet.GetQueryAsync(_mapper, options));
        }
    }

<br><br>

Do not use the EnableQuery Attribute

Using EnableQuery with AutoMapper.Extensions.OData will result in some operations being applied more than once e.g. in the tests, if TMandator has a total of two records then without EnableQuery applied to the controller action, the OData query http://localhost:16324/opstenant?$skip=1&$top=1&$orderby=Name will return one record as expected. However with EnableQuery applied no records will be returned because the skip operation has been applied twice.

<br><br>

OData query examples:

	http://localhost:<port>/opstenant?$top=5&$expand=Buildings&$filter=Name eq 'One'&$orderby=Name desc
	http://localhost:<port>/opstenant?$top=5&$expand=Buildings&$filter=Name ne 'One'&$orderby=Name desc
	http://localhost:<port>/opstenant?$filter=Name eq 'One'
	http://localhost:<port>/opstenant?$top=5&$expand=Buildings&$orderby=Name desc
	http://localhost:<port>/opstenant?$orderby=Name desc
	http://localhost:<port>/opstenant?$orderby=Name desc&$count=true
	http://localhost:<port>/opstenant?$top=5&$filter=Name eq 'One'&$orderby=Name desc&$count=true
	http://localhost:<port>/opstenant?$top=5&$select=Name, Identity
	http://localhost:<port>/opstenant?$top=5&$expand=Buildings&$filter=Name ne 'One'&$orderby=Name desc
	http://localhost:<port>/opstenant?$top=5&$expand=Buildings($expand=Builder($expand=City))&$filter=Name ne 'One'&$orderby=Name desc
	http://localhost:<port>/opstenant?$top=5&$select=Buildings,Name&$expand=Buildings($select=Name,Builder;$expand=Builder($select=Name,City;$expand=City))&$filter=Name ne 'One'&$orderby=Name desc

	http://localhost:<port>/corebuilding?$top=5&$expand=Builder,Tenant&$filter=name ne 'One L1'&$orderby=Name desc
	http://localhost:<port>/corebuilding?$top=5&$expand=Builder($expand=City),Tenant&$filter=name ne 'One L2'&$orderby=Name desc
Product 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 is compatible.  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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on AutoMapper.AspNetCore.OData.EFCore:

Package Downloads
RESTworld.AspNetCore

Package Description

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
9.0.0 656 12/19/2025
8.1.0 1,564 11/23/2025
8.0.0 10,344 7/12/2025
7.0.4 23,459 7/5/2025
7.0.2 50,637 5/10/2025
7.0.1 18,752 4/23/2025
7.0.0 65,259 2/15/2025
6.1.1 22,507 1/19/2025
6.1.0 7,863 1/3/2025
6.0.0 35,573 11/27/2024
5.0.2 1,314,853 7/27/2024
5.0.1 69,101 6/13/2024
5.0.0 769,453 2/19/2024
4.0.2 67,989 12/28/2023
4.0.1 173,087 8/19/2023
4.0.0 361,441 10/1/2022
3.0.6 23,190 10/1/2022
3.0.5 211,877 6/17/2022
3.0.4 23,482 4/15/2022
3.0.3 3,943 4/5/2022
3.0.2 3,545 2/26/2022
3.0.1 10,213 2/12/2022
3.0.0 6,730 1/31/2022
2.2.2 83,383 10/21/2021
2.2.1 54,862 8/9/2021
2.2.0-preview.1 2,477 4/10/2021
2.1.1 149,078 2/28/2021
2.1.1-preview.0 431 2/22/2021
2.1.0 41,760 11/27/2020
2.0.3-preview.2 456 11/12/2020
2.0.3-preview.1 471 11/9/2020
2.0.3-preview.0 1,116 11/2/2020
2.0.2 48,458 10/26/2020
2.0.2-preview.1 454 10/22/2020
2.0.2-preview.0 1,420 9/16/2020
2.0.1 3,476 9/8/2020
2.0.1-preview.1.2 448 9/8/2020
2.0.1-preview.1 445 9/4/2020
2.0.1-preview.0 652 8/26/2020
2.0.0 205,537 7/8/2020
1.0.5 21,903 5/25/2020
1.0.4-preview03 680 5/17/2020
1.0.3 1,695 5/3/2020
1.0.2-preview04 649 4/29/2020
1.0.1 3,865 2/9/2020
1.0.1-preview02 736 2/5/2020
1.0.1-preview01 636 2/4/2020
1.0.0 33,436 9/11/2019
1.0.0-preview07 657 9/9/2019

Supporting AutoMapper v16 (EF Core only).