Comment ajouter des valeurs pour une recherche dynamique dans Dapper.NET

c# dapper micro-orm

Question

Je développe une fonction de recherche de bons de commande en utilisant Dapper.NET . L'utilisateur peut effectuer une recherche par facture et par date d'achat.

Si l'utilisateur remplit la facture non sur la zone de texte, il effectuera une recherche par facture non,
si l'utilisateur remplit le numéro de facture et la date d'achat, il effectuera une recherche par facture et par date d'achat, et
si l'utilisateur remplit la date d'achat, il effectuera une recherche par date d'achat

Donc, la requête:

string query = "SELECT PurchaseDate, InvoiceNo, Supplier, Total FROM PurchaseOrder WHERE 1 = 1";

if (!string.IsNullOrEmpty(purchaseOrder.InvoiceNo))
{
    query += " AND InvoiceNo = @InvoiceNo";
}
if (purchaseOrder.PurchaseDate != DateTime.MinValue)
{
    query += " AND PurchaseDate = @PurchaseDate";
}

return this._db.Query<PurchaseOrder>(sql, ?).ToList();

Le problème est que je ne sais pas comment transmettre les valeurs dynamiquement en fonction du nombre de critères de la requête.

Réponse acceptée

En tirant un exemple de https://github.com/StackExchange/dapper-dot-net

 string query = "SELECT PurchaseDate, InvoiceNo, Supplier, Total FROM PurchaseOrder     WHERE 1 = 1";

 if (!string.IsNullOrEmpty(purchaseOrder.InvoiceNo))
 {
     sql += " AND InvoiceNo = @InvoiceNo";
 }
 if (purchaseOrder.PurchaseDate != DateTime.MinValue)
 {
    sql += " AND PurchaseDate = @PurchaseDate";
 }


  return this._db.Query<PurchaseOrder>(sql, new {InvoiceNo = new DbString { Value =     YourInvoiceNoVariable, IsFixedLength = true, Length = 10, IsAnsi = true });

pour la date d'achat, vous devez décider d'inclure les deux paramètres dans une seule instruction sql ou créer un appel distinct à _db.Query pour chaque


Réponse d'expert

L'option simple: inclure toutes les choses! Dapper va inspecter la requête et décider de ce qui n'est évidemment pas nécessaire, et les supprimer - en envoyant uniquement les paramètres qu'il trouve dans la requête. Donc, si certaines requêtes requièrent un @foo , d'autres ont besoin de @bar , d'autres ont besoin des deux et d'autres n'en ont besoin que de:

int foo = ...
string bar = ...
...Query<ResultType>(sql, new { foo, bar })...

Ou pour le faire manuellement: consultez DynamicParameters .



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