DAL con apuesto y C #

Tengo una capa de acceso a datos que utiliza Dapper pero no puedo evitar sentir que podría ser mucho más elegante. El DAL solo está pasando parámetros y mapeando el modelo según las respuestas nombradas del modelo para que esa parte sea sencilla al menos, pero odio el código que parece duplicado.

Aquí hay un ejemplo

 public IEnumerable<Product> ProductSearch(int? userId, DateTime?      modifiedAfter, DateTime? modifiedBefore, Guid? productId)
    {
        IList<Product> products;

        using (var connection = _connection.OpenConnection())
        {
            const string sproc = "dbo.stp_Product_Search";

            products = connection.Query<JobProduct>(sproc, new
            {
                User_ID = userId,
                Modified_After = modifiedAfter,
                Modified_Before = modifiedBefore,
                Product_ID = productId
            }, commandType: CommandType.StoredProcedure)
            .ToList();
        }
        return products;
    }

Tengo mucho código que es así pero con diferentes parámetros y entidades utilizados. ¿Alguien tiene algún buen ejemplo?

Respuestas a la pregunta(2)

Su respuesta a la pregunta