Cómo agregar valores para buscar dinámicamente en Dapper.NET

c# dapper micro-orm

Pregunta

Estoy desarrollando una función de búsqueda de órdenes de compra usando Dapper.NET . El usuario puede buscar por el número de factura y la fecha de compra.

Si el usuario llena la factura no en el cuadro de texto, buscará por la factura no,
si el usuario completa el número de factura y la fecha de compra, buscará por el número de factura y la fecha de compra, y
si el usuario completa la fecha de compra, buscará por fecha de compra

Entonces, la consulta:

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();

El problema es que no sé cómo pasar los valores dinámicamente en función del número de criterios en la consulta.

Respuesta aceptada

Extrayendo una muestra 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 });

para la fecha de compra, debe decidir si desea incluir ambos parámetros en una declaración sql o crear una llamada separada a _db.Query para cada


Respuesta experta

La opción simple: ¡incluir todas las cosas! Dapper inspeccionará la consulta y decidirá cuáles obviamente no son necesarios, y los eliminará, solo enviará los parámetros que puede encontrar mencionados en la consulta. Entonces, si algunas consultas requieren @foo , algunas necesitan @bar , algunas necesitan ambas y algunas no necesitan ninguna, entonces simplemente:

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

O para hacerlo manualmente: echa un vistazo a DynamicParameters .



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué