AutoMapper.AspNetCore.OData.EFCore 7.0.2

Prefix Reserved
dotnet add package AutoMapper.AspNetCore.OData.EFCore --version 7.0.2
                    
NuGet\Install-Package AutoMapper.AspNetCore.OData.EFCore -Version 7.0.2
                    
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="7.0.2" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="AutoMapper.AspNetCore.OData.EFCore" Version="7.0.2" />
                    
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 7.0.2
                    
#r "nuget: AutoMapper.AspNetCore.OData.EFCore, 7.0.2"
                    
#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.
#addin nuget:?package=AutoMapper.AspNetCore.OData.EFCore&version=7.0.2
                    
Install AutoMapper.AspNetCore.OData.EFCore as a Cake Addin
#tool nuget:?package=AutoMapper.AspNetCore.OData.EFCore&version=7.0.2
                    
Install AutoMapper.AspNetCore.OData.EFCore 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 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. 
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
7.0.2 8,188 5/10/2025
7.0.1 1,959 4/23/2025
7.0.0 31,508 2/15/2025
6.1.1 14,081 1/19/2025
6.1.0 5,825 1/3/2025
6.0.0 19,215 11/27/2024
5.0.2 748,559 7/27/2024
5.0.1 50,555 6/13/2024
5.0.0 683,538 2/19/2024
4.0.2 59,520 12/28/2023
4.0.1 159,870 8/19/2023
4.0.0 330,714 10/1/2022
3.0.6 22,513 10/1/2022
3.0.5 208,764 6/17/2022
3.0.4 23,300 4/15/2022
3.0.3 3,816 4/5/2022
3.0.2 3,385 2/26/2022
3.0.1 10,044 2/12/2022
3.0.0 6,578 1/31/2022
2.2.2 80,184 10/21/2021
2.2.1 54,284 8/9/2021
2.2.0-preview.1 2,356 4/10/2021
2.1.1 147,180 2/28/2021
2.1.1-preview.0 311 2/22/2021
2.1.0 41,577 11/27/2020
2.0.3-preview.2 333 11/12/2020
2.0.3-preview.1 342 11/9/2020
2.0.3-preview.0 983 11/2/2020
2.0.2 48,320 10/26/2020
2.0.2-preview.1 322 10/22/2020
2.0.2-preview.0 1,289 9/16/2020
2.0.1 3,303 9/8/2020
2.0.1-preview.1.2 328 9/8/2020
2.0.1-preview.1 320 9/4/2020
2.0.1-preview.0 532 8/26/2020
2.0.0 203,501 7/8/2020
1.0.5 21,679 5/25/2020
1.0.4-preview03 528 5/17/2020
1.0.3 1,559 5/3/2020
1.0.2-preview04 492 4/29/2020
1.0.1 3,625 2/9/2020
1.0.1-preview02 575 2/5/2020
1.0.1-preview01 488 2/4/2020
1.0.0 32,984 9/11/2019
1.0.0-preview07 509 9/9/2019

Supporting AutoMapper v14 (EF Core only).