Combinando código C # e código de banco de dados em uma Especificação

s vezes, você precisa definir algumas regras de negócios e o padrão de especificação é uma ferramenta útil. Por exemplo

public class CanBorrowBooksSpec : ISpecification<Customer>
{
    public bool Satisfies(Customer customer)
    {
         return customer.HasLibraryCard
              && !customer.UnpaidFines.Any();
    }
}

o entanto, muitas vezes acho que preciso "inserir" essas regras no SQL para melhorar o desempenho ou atender a coisas como listas de registros paginada

Em seguida, tenho que escrever o código para as regras duas vezes, uma vez no código CLR e uma vez na SQL (ou linguagem ORM

Como você organiza códigos como este?

Parece melhor se o código foi mantido junto na mesma classe. Dessa forma, se o desenvolvedor estiver atualizando as regras de negócios, ele terá menos chance de esquecer de atualizar os dois conjuntos de códigos. Por exemplo

public class CanBorrowBooksSpec : ISpecification<Customer>
{
    public bool Satisfies(Customer customer)
    {
         return customer.HasLibraryCard
              && !customer.UnpaidFines.Any();
    }

    public void AddSql(StringBuilder sql)
    {
        sql.Append(@"customer.HasLibraryCard 
                     AND NOT EXISTS (SELECT Id FROM CustomerUnpaidFines WHERE CustomerId = customer.Id)");
    }
}

No entanto, isso me parece bastante feio, pois agora estamos misturando preocupaçõe

Outra alternativa seria usar uma solução Linq-To-YourORM, pois o código LINQ poderia ser executado em uma coleção ou traduzido para SQL. Mas descobri que essas soluções raramente são possíveis em nada além dos cenários mais triviai

O que você faz

questionAnswers(1)

yourAnswerToTheQuestion