Combinaisons des critères Where - Requête toujours paramétrée - Dapper

c#-4.0 dapper tsql

Question

J'ai une requête Dapper comme suit

Public void GetAllCusomers(string CustmoerId, StringFirstName, String LastName, String Gender)
    {
        TblCustomer tblCustomer  = new TblCustomer();

        using (var sqlConnection = new SqlConnection(“DatabaseConncetionString"))
        {
            sqlConnection.Open();
            //tblCustomer = sqlConnection.Query<TblCustomer >("SELECT *  FROM tblCustomer WHERE CustomerId = @CustomerID" AND FirstName = @FirstName……………, new { CustomerID = CustomerId,……………. }).ToList(); 
            tblCustomer = sqlConnection.Query<TblCustomer >("SELECT *  FROM tblCustomer WHERE CustomerId = @CustomerID", new { CustomerID = CustomerId }).ToList();
            sqlConnection.Close();
        }
}

La question est de savoir comment construire la requête? Dans la méthode ci-dessus, l'utilisateur peut fournir une valeur à tous les paramètres qu'il souhaite interroger. Si la valeur du paramètre est vide, elle ne sera pas utilisée dans le critère WHERE. Je vais utiliser tous les paramètres fournis dans les critères avec les opérations AND.

Sans Dapper, il est facile de générer la requête dynamique en concaténant l'instruction SQL en fonction des paramètres fournis. Comment construire ces requêtes dans Dapper sans compromettre la fonctionnalité paramétrée.

Merci Ganesh

Réponse populaire

Vous le feriez de la même manière que vous générez une requête dynamique. Construisez votre chaîne de manière dynamique (en fonction de l'entrée utilisateur), en n'incluant que les filtres dans la clause Where si nécessaire. Exmpale:

var query = new StringBuilder("select * from users where ");

if(!string.IsNullOrEmpty(firstname)) query.Append("FirstName = @FirstName ");

En ce qui concerne la transmission des paramètres, vous pouvez soit construire un objet incluant tous vos paramètres possibles avec des valeurs à transmettre:

new {FirstName = "John", LastName = "Doe"}

ou, si vous voulez seulement transmettre des paramètres qui seront effectivement utilisés, vous pouvez créer un Dictionary<string,object> qui contient uniquement les paramètres à transmettre:

new Dictionary<string,object> { {"FirstName", "John" } }



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi