Saltar al contenido

Cómo usar Dapper con Linq

Si encuentras alguna incompatibilidad con tu código o trabajo, recuerda probar siempre en un ambiente de testing antes aplicar el código al trabajo final.

Solución:

En primer lugar, dijo uno de los autores de Dapper, cuando alguien preguntó

¿Hay algún plan para hacer que Dapper.net sea compatible con las interfaces IQueryable?

ese

no hay planes para hacer esto. Está muy lejos de lo que dapper intenta hacer. Hasta ahora diría que es antitético. Dapper core trata de ser el amigo de aquellos que aman su SQL.

(consulte https://stackoverflow.com/a/27588877/3813189).

En cierto modo, eso sugiere que los diversos paquetes de extensión para NuGet pueden ayudar, como ha sugerido.

Probé DapperExtensions, que hace que escribir los filtros de consulta de forma programática sea un poco más fácil, por ejemplo.

using System.Data.SqlClient;
using DapperExtensions;

namespace StackOverflowAnswer

    class Program
    
        static void Main(string[] args)
        
            using (var cn = new SqlConnection("Server=.;Database=NORTHWND;Trusted_Connection=True;"))
            
                var list = cn.GetList(
                    Predicates.Field(f => f.Discontinued, Operator.Eq, false)
                );
            
        

        class Products
        
            public int ProductId  get; set; 
            public string ProductName  get; set; 
            public bool Discontinued  get; set; 
        
    

También probé Dapper.Extensions.Linq (el paquete que sugirió), que promete

se basa en esto proporcionando acceso avanzado a la base de datos a través de consultas Linq. La configuración fluida hace que la configuración sea simple y rápida.

Desafortunadamente, tampoco pude llegar muy lejos con eso. No hay mucha documentación y las pruebas no parecen cubrir QueryBuilder, que es lo que parece ser la clase a usar para traducir Linq Expressions en los predicados de Dapper Extensions (como se sugiere en el problema Analizar expresiones booleanas con QueryBuilder) . Intenté lo siguiente, que requería agregar la interfaz IEntity a mi DTO:

using System;
using System.Data.SqlClient;
using System.Linq.Expressions;
using Dapper.Extensions.Linq.Builder;
using Dapper.Extensions.Linq.Core;
using DapperExtensions;

namespace StackOverflowAnswer

    class Program
    
        static void Main(string[] args)
        
            using (var cn = new SqlConnection("Server=.;Database=NORTHWND;Trusted_Connection=True;"))
            
                Expression> filter = p => !p.Discontinued;
                var queryFilter = QueryBuilder.FromExpression(filter);

                var list = cn.GetList(
                    queryFilter
                );
            
        

        class Products : IEntity
        
            public int ProductId  get; set; 
            public string ProductName  get; set; 
            public bool Discontinued  get; set; 
        
    

.. pero falló en tiempo de ejecución con el error

No se encontró el operador para StackOverflowAnswer.Program+Products

No estoy seguro de por qué funciona generar el Predicado manualmente (el primer ejemplo), pero QueryBuilder no.

Diría que parece cada vez más que los comentarios dejados en su pregunta son correctos, que necesitará volver a trabajar en su código lejos de las expresiones que usó con Entity Framework. Dado que ha sido tan difícil encontrar información sobre esta clase de QueryBuilder, me preocuparía que (incluso si lo hiciera funcionar) sería difícil obtener ayuda para cualquier problema que encontrara (y los errores pueden no solucionarse).

Escribí una utilidad para trabajar EF con Dapper usando attributes. Analizo el predicado y lo traduzco a SQL.

“Usuarios” POCO:

[Table("Users")]
public class User

    [Key]
    [Identity]
    public int Id  get; set; 

    public string Login  get; set;

    [Column("FName")]
    public string FirstName  get; set; 

    [Column("LName")]
    public string LastName  get; set; 

    public string Email  get; set; 

    [NotMapped]
    public string FullName
    
        get
        
            return string.Format("0 1", FirstName, LastName);
        
    

Y consulta sencilla:

using (var cn = new SqlConnection("..."))

    var usersRepository = new DapperRepository(cn)
    var allUsers = await userRepository.FindAllAsync(x => x.AccountId == 3 && x.Status != UserStatus.Deleted);

¿Quizás te sea útil?

MicroOrm.Dapper.Repositorios

valoraciones y reseñas

Nos puedes respaldar nuestro análisis exponiendo un comentario y puntuándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *