148 lines
3.7 KiB
C#
148 lines
3.7 KiB
C#
// See https://aka.ms/new-console-template for more information
|
|
|
|
using System.Runtime.InteropServices;
|
|
using AutoMapper;
|
|
using AutoMapper.QueryableExtensions;
|
|
using Baguette.Querying;
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
using Test;
|
|
|
|
var services = new ServiceCollection();
|
|
services.AddQueryProfiles(typeof(Model));
|
|
|
|
services.AddAutoMapper(typeof(Model));
|
|
var provider = services.BuildServiceProvider();
|
|
|
|
var processor = provider.GetRequiredService<IQueryProcessor>();
|
|
var mapper = provider.GetRequiredService<IMapper>();
|
|
|
|
var list = new[]
|
|
{
|
|
new Model
|
|
{
|
|
FirstName = "Jens",
|
|
LastName = "De Craecker",
|
|
BirthDate = new DateOnly(1998, 6, 30),
|
|
Nested = new NestedModel
|
|
{
|
|
FirstName = "Jens",
|
|
LastName = "De Craecker",
|
|
BirthDate = new DateOnly(1998, 6, 30),
|
|
NestedInNested = new NestedNestedModel
|
|
{
|
|
Text = "Hello World!"
|
|
}
|
|
},
|
|
Nested2 = new NestedModel
|
|
{
|
|
FirstName = "Jens",
|
|
LastName = "De Craecker",
|
|
BirthDate = new DateOnly(1998, 6, 30),
|
|
NestedInNested = new NestedNestedModel
|
|
{
|
|
Text = "Hello World!"
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
var filters = new ModelFilters()
|
|
{
|
|
// FirstName = "Jens",
|
|
// Sorting = new[]
|
|
// {
|
|
// new SortingOptions()
|
|
// {
|
|
// SortBy = "LastName"
|
|
// }
|
|
// }
|
|
Search = "Jens"
|
|
};
|
|
|
|
var query = list.AsQueryable().ApplyFilters(processor, filters).ProjectTo<ResponseModel>(mapper.ConfigurationProvider);
|
|
var result = query.ToList();
|
|
|
|
//
|
|
// var json = JsonSerializer.Serialize(filters, typeof(ModelFilters));
|
|
//
|
|
// var filters2 = JsonSerializer.Deserialize<ModelFilters>(json);
|
|
//
|
|
// var result = list.AsQueryable().ApplyFilters(processor, filters).ToList();
|
|
//
|
|
// var pipelineProvider = provider.GetRequiredService<IQueryPipelineProvider>();
|
|
//
|
|
// var result2 = list.AsQueryable().Where(pipelineProvider.GetPredicate<ModelFilters, Model>(filters)).ToList();
|
|
|
|
return;
|
|
|
|
class MappingProfile : Profile
|
|
{
|
|
public MappingProfile()
|
|
{
|
|
CreateMap<Model, ResponseModel>();
|
|
}
|
|
}
|
|
|
|
public record ResponseModel(string FirstName, string LastName);
|
|
|
|
[GenerateFilters(IncludeSorting = true, IncludePaging = true)]
|
|
public record Model
|
|
{
|
|
[FilterMode(FilterMode.Contains)]
|
|
[Searchable]
|
|
public required string FirstName { get; init; }
|
|
|
|
[SortAlias("Surname")]
|
|
[SortAlias("")]
|
|
[Searchable]
|
|
public required string LastName { get; init; }
|
|
|
|
public required DateOnly BirthDate { get; init; }
|
|
|
|
[FilterMode(FilterMode.InList)]
|
|
public TestEnum TestEnum { get; init; }
|
|
|
|
[SortAlias("NestedAlias")]
|
|
[SortAlias("")]
|
|
[Searchable]
|
|
public required NestedModel Nested { get; init; }
|
|
|
|
public required NestedModel Nested2 { get; init; }
|
|
}
|
|
|
|
[StructLayout(LayoutKind.Auto)]
|
|
public readonly partial record struct ModelFilters { }
|
|
|
|
namespace Test
|
|
{
|
|
public enum TestEnum
|
|
{
|
|
Hello
|
|
}
|
|
|
|
[GenerateNestedFilters]
|
|
public record NestedModel
|
|
{
|
|
[FilterMode(FilterMode.Contains)]
|
|
[FilterName("HelloWorld")]
|
|
public required string FirstName { get; init; }
|
|
|
|
[Searchable]
|
|
public required string LastName { get; init; }
|
|
|
|
public required DateOnly BirthDate { get; init; }
|
|
|
|
[FilterMode(FilterMode.InList)]
|
|
public TestEnum TestEnum { get; init; }
|
|
|
|
[SortAlias("NestedNestedAlias")]
|
|
public required NestedNestedModel NestedInNested { get; init; }
|
|
}
|
|
|
|
[GenerateNestedFilters]
|
|
public record NestedNestedModel
|
|
{
|
|
[SortAlias("TextAlias")]
|
|
public required string Text { get; init; }
|
|
}
|
|
} |