RoyalCode.SmartSelector.Generators
0.4.0
dotnet add package RoyalCode.SmartSelector.Generators --version 0.4.0
NuGet\Install-Package RoyalCode.SmartSelector.Generators -Version 0.4.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="RoyalCode.SmartSelector.Generators" Version="0.4.0" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="RoyalCode.SmartSelector.Generators" Version="0.4.0" />
<PackageReference Include="RoyalCode.SmartSelector.Generators" />
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 RoyalCode.SmartSelector.Generators --version 0.4.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
#r "nuget: RoyalCode.SmartSelector.Generators, 0.4.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 RoyalCode.SmartSelector.Generators@0.4.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=RoyalCode.SmartSelector.Generators&version=0.4.0
#tool nuget:?package=RoyalCode.SmartSelector.Generators&version=0.4.0
The NuGet Team does not provide support for this client. Please contact its maintainers for support.
SmartSelector
Gerador/Source Generator para criar automaticamente projeções (Expression<Func<TFrom, TDto>>), métodos auxiliares e propriedades em DTOs, reduzindo drasticamente boilerplate em consultas LINQ / EF Core.
Principais Recursos
[AutoSelect<TFrom>]: gera expressão de seleção, métodoFrom, extensõesSelect{Dto}/To{Dto}.[AutoProperties]ou[AutoProperties<TFrom>]: gera propriedades simples automaticamente (primitivos, string, bool, DateTime, enum, struct, coleções simplesIEnumerable<T>desses tipos).- Flattening por convenção: nomes concatenados em PascalCase resolvem cadeias aninhadas (ex.:
CustomerAddressCountryRegionName?a.Customer.Address.Country.Region.Name). - Exclusão de propriedades:
Exclude = [ nameof(Entity.Prop) ]. - Diagnósticos de compilação para uso incorreto, tipos incompatíveis e conflitos.
Quickstart
- Instalação
<ItemGroup>
<PackageReference Include="RoyalCode.SmartSelector" Version="x.y.z" />
<PackageReference Include="RoyalCode.SmartSelector.Generators" Version="x.y.z" OutputItemType="Analyzer" ReferenceOutputAssembly="false" />
</ItemGroup>
- Anote seu DTO
[AutoSelect<User>, AutoProperties]
public partial class UserDetails { }
- Consulte com EF Core
var list = db.Users.SelectUserDetails().ToList();
var dto = UserDetails.From(user);
var expr = UserDetails.SelectUserExpression; // reutilizável / componível
Escopo e foco
- Sem custom resolvers, conditional mapping ou naming policies.
- Foco: projeções traduzíveis por EF Core e mapeamento 1x1 (estilo Adapt do Mapster).
Links úteis
- Documentação completa:
src/docs.md - Projeto Demo:
RoyalCode.SmartSelector.Demo - Benchmarks:
RoyalCode.SmartSelector.Benchmarks
Frameworks e pacotes suportados
- Runtime lib:
RoyalCode.SmartSelector(TFMs: .NET 8, .NET 9, .NET 10) - Generator:
RoyalCode.SmartSelector.Generators(TFM: .NET Standard 2.0, instalado como Analyzer)
Exemplo 1 – Projeção Simples
[AutoSelect<User>, AutoProperties]
public partial class UserDetails { }
// Uso
var list = db.Users.SelectUserDetails().ToList();
var dto = UserDetails.From(user);
var expr = UserDetails.SelectUserExpression; // reutilizável / componível
Código gerado (essencial):
public static Expression<Func<User, UserDetails>> SelectUserExpression => u => new UserDetails
{
Id = u.Id,
Name = u.Name
};
public static UserDetails From(User u) => (selectUserFunc ??= SelectUserExpression.Compile())(u);
Exemplo 2 – Objeto Aninhado + Exclusão
[AutoSelect<Book>, AutoProperties(Exclude = [ nameof(Book.Sku) ])]
public partial class BookDetails
{
public ShelfDetails Shelf { get; set; }
}
[AutoProperties<Shelf>]
public partial class ShelfDetails { }
Trecho gerado:
new BookDetails
{
Shelf = new ShelfDetails
{
Id = a.Shelf.Id,
Location = a.Shelf.Location
},
Price = a.Price,
};
// Sku excluído
Exemplo 3 – Flattening Profundo
public class Order
{
public Customer Customer { get; set; }
}
// Customer -> Address -> Country -> Region
[AutoSelect<Order>]
public partial class OrderDetails
{
public string CustomerAddressCountryRegionName { get; set; }
}
Trecho da expressão:
CustomerAddressCountryRegionName = a.Customer.Address.Country.Region.Name
Exemplos mínimos por atributo
AutoSelect<T>:
[AutoSelect<Product>]
public partial class ProductDetails { }
// Uso:
db.Products.SelectProductDetails().ToList();
AutoProperties:
[AutoSelect<Simple>, AutoProperties]
public partial class SimpleDto { /* propriedades simples geradas automaticamente */ }
Para usar AutoProperties, o tipo de origem é inferido do AutoSelect<TFrom>.
AutoProperties<TFrom>:
[AutoProperties<User>]
public partial class UserSnapshot { }
- DTO aninhado +
Exclude:
[AutoSelect<Order>, AutoProperties<Order>(Exclude = [ nameof(Order.InternalCode) ])]
public partial class OrderDetails
{
public CustomerDetails Customer { get; set; }
}
[AutoProperties<Customer>]
public partial class CustomerDetails { }
- Flattening por nome:
[AutoSelect<Order>]
public partial class OrderFlat
{
public string CustomerAddressCity { get; set; }
}
// Gera: CustomerAddressCity = a.Customer.Address.City
Regras de Flattening
- Nome da propriedade = concatenação PascalCase dos segmentos do caminho.
- Sem necessidade de atributos extras.
Tipos Suportados em AutoProperties
- Primitivos numéricos,
bool,string,char,DateTime/ nullable simples enum,structIEnumerable<T>ondeTé suportado acima / enum / struct
Exclusões
[AutoProperties<Product>(Exclude = [ nameof(Product.InternalCode), nameof(Product.Secret) ])]
Diagnósticos Principais
- Tipos inválidos ou classe não
partial(RCSS000). - Propriedade não encontrada (
RCSS001). - Tipos incompatíveis (
RCSS002). - Uso incorreto de atributos (
RCSS003–RCSS005).
Limitações Resumidas
- Sem renome/alias explícito ainda (
MapFrom). - Sem transformações de tipo (formatters / custom converters).
- Desambiguação de flattening limitada em colisões de prefixo.
Boas Práticas
- Use
nameofemExclude. - Prefira consumir a expressão gerada para reutilização e composição LINQ.
- Para caminhos muito longos, avalie DTOs aninhados por clareza.
FAQ Rápido
| Pergunta | Resposta |
|---|---|
| Preciso configurar algo no runtime? | Não, pura geração de código. |
| Funciona com EF Core? | Sim, a expressão é traduzível. |
| Posso só gerar propriedades? | Sim: [AutoProperties<TFrom>]. |
| Flattening precisa de atributo? | Não, é por nome. |
Mais Informações
- Documentação detalhada: ver
docs.mdno repositório. - Projeto Demo: ver
RoyalCode.SmartSelector.Demo. - Benchmarks: ver
RoyalCode.SmartSelector.Benchmarks.
Happy coding!
There are no supported framework assets in this package.
Learn more about Target Frameworks and .NET Standard.
-
.NETStandard 2.0
- RoyalCode.Extensions.SourceGenerator (>= 0.1.13)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.