A motivação por traz do Razor.Orm é de trazer um framework fácil de usar, performatico e que der poder ao desenvolvedor na hora de fazer SQLs puros. perfeito para especialistas em banco de dados.
Leia isso em outras linguagens: English, Português(Brasil).
Para baixar e instalar você deve acessar o link abaixo:
Para começar é necessário montar uma estrutura de camada de persistência, precisamos criar classes Dto(classes POCO) que serão responsáveis pelo tráfego de dados.
namespace MyProject
{
    public class PeopleFilterDto
    {
        public string LikeFirstName { get; set; }
        public long[] EmailPromotionOptions { get; set; }
    }
    public class PeopleDto
    {
        public int Id { get; set; }
        public DateTime Date { get; set; }
        public string FirstName { get; set; }
    }
}Em seguida devemos criar uma interface que contenha o layout que será implementado pelo Razor.Orm para aquele determinado Dao.
namespace MyProject
{
    public interface IPeopleDao
    {
        IEnumerable<PeopleDto> GetAllPeople(PeopleFilterDto dto);
    }
}Agora criaremos um arquivo 'cshtml' para cada método que foi definido na interface anteriormente, é necessário que esses arquivos tenham exatamente o mesmo nome do método correlacionado, fiquem no mesmo diretório onde está a interface e que a 'Ação de Compilação' seja ajustada para opção 'Recurso inserido'.
@using Razor.Orm.Template
@using MyProject
@inherits SqlTemplate<PeopleFilterDto, PeopleDto>
SELECT [BusinessEntityID] @As(e => e.Id)
      ,[FirstName]
      ,[ModifiedDate] @As(e => e.Date)
    FROM [Person].[Person]
    @using (Smart.Where)
    {
        if (!string.IsNullOrEmpty(Model.LikeFirstName))
        {
            <text>[FirstName] LIKE @Par($"%{Model.LikeFirstName}%")</text>
        }
        if (Model.EmailPromotionOptions != null && Model.EmailPromotionOptions.Length > 0)
        {
            Smart.And();
            <text>[EmailPromotion] @In(Model.EmailPromotionOptions)</text>
        }
    }O diretório deve ter a seguinte estrutura.
PeopleDao
├── IPeopleDao.cs
└── GetAllPeople.cshtml
Para o projeto funcionar corretament devemos ajustar 'PreserveCompilationContext' para 'true' dentro do arquivo *.csproj no agrupamento 'PropertyGroup'.
<PropertyGroup>
    ...
    <PreserveCompilationContext>true</PreserveCompilationContext>
</PropertyGroup>Nesse momento é necessário estender a classe DaoFactory criando sua própria fábrica de Daos, apos isso é só executar.
namespace MyProject
{
    public class MyDaoFactory : DaoFactory
    {
        protected override void Setup()
        {
            Define<IPeopleDao>();
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            var myDaoFactory = new MyDaoFactory();
        
            using (var connection = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=AdventureWorks2017;Integrated Security=True"))
            {
                connection.Open();
                var dao = myDaoFactory.CreateDao<IPeopleDao>(connection);
                foreach (var item in dao.GetAllPeople(new PeopleFilterDto()
                {
                    LikeFirstName = "Ken",
                    EmailPromotionOptions = new long[] { 0, 1 }
                }))
                {
                    Console.WriteLine($"Id: {item.Id}, Date: {item.Date}, FirstName: {item.FirstName}");
                }
            }
        }
    }
}Para uma melhor integração com o LightInject foi feito o DaoCompositionRoot onde você pode baixar e instalar acessando o link abaixo:
LightInject.Razor.Orm NuGet library
Em seguida é necessário estender a classe DaoCompositionRoot criando um CompositionRoot que será registrado em um ServiceContainer, para mais detalhes visitar a documentação do LightInject.
Depois é só executar.
namespace MyProject
{
    public class MyDaoCompositionRoot : DaoCompositionRoot
    {
        protected override DbConnection CreateConnection(IServiceFactory serviceFactory)
        {
            var sqlConnection = new SqlConnection("Data Source=localhost\\SQLEXPRESS;Initial Catalog=AdventureWorks2017;Integrated Security=True");
            sqlConnection.Open();
            return sqlConnection;
        }
        protected override ILifetime ConnectionLifetime => new PerContainerLifetime();
        protected override void Setup()
        {
            Define<IPeopleDao>();
        }
    }
    public class Program
    {
        public static void Main(string[] args)
        {
            var container = new ServiceContainer();
            container.RegisterFrom<MyDaoCompositionRoot>();
            var dao = container.GetInstance<IPeopleDao>();
            foreach (var item in dao.GetAllPeople(new PeopleFilterDto()
            {
                LikeFirstName = "Ken",
                EmailPromotionOptions = new long[] { 0, 1 }
            }))
            {
                Console.WriteLine($"Id: {item.Id}, Date: {item.Date}, FirstName: {item.FirstName}");
            }
        }
    }
}A busca realizada vai ser essa onde '@p0' é igual '%Ken%'.
SELECT [BusinessEntityID] as 'Id'
      ,[FirstName]
      ,[ModifiedDate] as 'Date'
    FROM [Person].[Person]
 WHERE [FirstName] LIKE @p0 AND [EmailPromotion] in (0,1)E a saída no console vai ser essa.
Id: 10300, Date: 27/12/2013 00:00:00, FirstName: Mackenzie
Id: 15145, Date: 05/08/2012 00:00:00, FirstName: Kendra
Id: 15137, Date: 22/04/2013 00:00:00, FirstName: Kendra
Id: 2618, Date: 28/11/2013 00:00:00, FirstName: Kenneth
Id: 8832, Date: 01/03/2014 00:00:00, FirstName: Mackenzie
Id: 10361, Date: 14/07/2013 00:00:00, FirstName: Mackenzie
Id: 2625, Date: 27/03/2014 00:00:00, FirstName: Kenneth
Id: 15163, Date: 13/11/2013 00:00:00, FirstName: Kendra
...