AutoMapper.AspNetCore.OData.EFCore 7.0.0

Prefix Reserved
dotnet add package AutoMapper.AspNetCore.OData.EFCore --version 7.0.0                
NuGet\Install-Package AutoMapper.AspNetCore.OData.EFCore -Version 7.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="7.0.0" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add AutoMapper.AspNetCore.OData.EFCore --version 7.0.0                
#r "nuget: AutoMapper.AspNetCore.OData.EFCore, 7.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.
// Install AutoMapper.AspNetCore.OData.EFCore as a Cake Addin
#addin nuget:?package=AutoMapper.AspNetCore.OData.EFCore&version=7.0.0

// Install AutoMapper.AspNetCore.OData.EFCore as a Cake Tool
#tool nuget:?package=AutoMapper.AspNetCore.OData.EFCore&version=7.0.0                

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. 
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.0 221 2/15/2025
6.1.1 3,749 1/19/2025
6.1.0 3,289 1/3/2025
6.0.0 6,253 11/27/2024
5.0.2 391,532 7/27/2024
5.0.1 36,897 6/13/2024
5.0.0 628,204 2/19/2024
4.0.2 52,549 12/28/2023
4.0.1 153,436 8/19/2023
4.0.0 313,794 10/1/2022
3.0.6 22,171 10/1/2022
3.0.5 206,231 6/17/2022
3.0.4 23,117 4/15/2022
3.0.3 3,788 4/5/2022
3.0.2 3,343 2/26/2022
3.0.1 10,011 2/12/2022
3.0.0 6,542 1/31/2022
2.2.2 77,627 10/21/2021
2.2.1 53,800 8/9/2021
2.2.0-preview.1 2,321 4/10/2021
2.1.1 145,715 2/28/2021
2.1.1-preview.0 269 2/22/2021
2.1.0 41,520 11/27/2020
2.0.3-preview.2 292 11/12/2020
2.0.3-preview.1 300 11/9/2020
2.0.3-preview.0 941 11/2/2020
2.0.2 48,270 10/26/2020
2.0.2-preview.1 279 10/22/2020
2.0.2-preview.0 1,247 9/16/2020
2.0.1 3,259 9/8/2020
2.0.1-preview.1.2 285 9/8/2020
2.0.1-preview.1 278 9/4/2020
2.0.1-preview.0 489 8/26/2020
2.0.0 202,175 7/8/2020
1.0.5 21,464 5/25/2020
1.0.4-preview03 476 5/17/2020
1.0.3 1,510 5/3/2020
1.0.2-preview04 444 4/29/2020
1.0.1 3,521 2/9/2020
1.0.1-preview02 526 2/5/2020
1.0.1-preview01 441 2/4/2020
1.0.0 32,755 9/11/2019
1.0.0-preview07 458 9/9/2019

Supporting AutoMapper v14 (EF Core only).