INTRODUÇÃO · LINQ-SOURCEGENERATOReQuantic.Linq.SourceGeneratorO eQuantic.Linq.SourceGenerator é a metade em tempo de compilação do eQuantic.Linq: escreve as especificações, os filtros e os ordenadores de que uma classe marcada precisa, com Roslyn.
Visão geral
Nada se resolve por reflexão enquanto um pedido espera, pelo que o custo passa para a compilação e os erros para o compilador.Requer .NET 6 ou posterior, fica ao lado do pacote principal e configura-se por atributo: um na classe e um em cada propriedade que deva receber operadores.
Instalar
shell
dotnet add package eQuantic.Linq.SourceGenerator
O que faz
Sem reflexão em execuçãoCada especificação é escrita na compilação, pelo que o pedido não paga nada por descobrir o que consultar.
Erros enquanto escreveO que gera são membros reais: autocompletam-se, e um nome que não existe é um erro de compilação e não um resultado vazio.
Configuração por atributoDois atributos: para que classes gerar e que operadores cada propriedade deve receber.
Encaixa no que já existeFunciona com o eQuantic.Linq, com o Entity Framework e com qualquer outra coisa que aceite uma expressão.
Sem reflexão em execuçãoCada especificação é escrita na compilação, pelo que o pedido não paga nada por descobrir o que consultar.
Erros enquanto escreveO que gera são membros reais: autocompletam-se, e um nome que não existe é um erro de compilação e não um resultado vazio.
Configuração por atributoDois atributos: para que classes gerar e que operadores cada propriedade deve receber.
Encaixa no que já existeFunciona com o eQuantic.Linq, com o Entity Framework e com qualquer outra coisa que aceite uma expressão.
Início rápido
Referenciar como dependência de compilação — Corre durante a compilação e não é distribuído com nada: é isso que PrivateAssets diz.
Marcar o que deve ser gerado — O atributo na classe inscreve-a. O de uma propriedade escolhe os operadores que a essa propriedade convêm.
C#
[GenerateSpecifications]public class Product{ public int Id { get; set; } [SpecProperty(FilterOperators = FilterOperator.Equals | FilterOperator.Contains)] public string Name { get; set; } = string.Empty; [SpecProperty(FilterOperators = FilterOperator.GreaterThan | FilterOperator.LessThan)] public decimal Price { get; set; }}
Usar os membros que escreveu — Ficam na classe que marcou, pelo que a consulta se lê como uma frase sobre o modelo e não sobre a tabela.
C#
var cheapCoffee = Product.Specifications .NameContains("coffee") .And(Product.Specifications.PriceLessThan(10m));var found = await _repository.GetAsync(cheapCoffee);
Superfície pública
NAMESPACE
SUPERFÍCIE PÚBLICA
GenerateSpecificationsAttribute
Marca uma classe para a qual o gerador deve escrever especificações.
SpecPropertyAttribute
Diz que operadores de filtro uma propriedade deve receber.
FilterOperator
Os operadores que se podem dar a uma propriedade: igual, contém, começa por, maior que e os restantes.
Prefere ler código?
Todos os pacotes são MIT e públicos, e os exemplos são para copiar e colar.