sql .net c#-4.0 dapper

sql - ¿Cómo construyo una cláusula dinámica donde Dapper al pasar en un modelo?



.net c#-4.0 (4)

Esto debería hacer el truco por ti, limpio y simple:

var selectSql = "SELECT * FROM PersonTable WHERE (@FirstName IS NULL OR FirstName = @FirstName) AND (@LastName IS NULL OR LastName = @LastName) AND (@City IS NULL OR City = @City) AND (@Id IS NULL OR Id = @Id)"; return conn.Query<PersonModel>(selectSql, new { model.FirstName, model.Lastname, model.City, Id = model.Id == 0? (int?)null: (int?)model.Id }).ToList();

Tengo un modelo de ejemplo que se ve así:

public class PersonModel { public int Id {get; set;} public string FirstName {get; set;} public string Lastname {get; set;} public string City {get; set;} }

En mi repositorio, quiero crear un método de búsqueda donde paso en mi modelo, pero no todos los campos siempre se rellenarán. Quiero crear un DÓNDE y un AND en función de si un campo en el modelo se rellena o no. Si el campo no se rellena, no quiero crear una cláusula WHERE para él.

Por ejemplo, si paso FirstName = "Bob" y City = "Boston", entonces quiero que mi búsqueda se vea así:

SELECT * FROM PersonTable WHERE FirstName = @firstName AND City = @city

Como no pasé la Id. O el Apellido, no quiero que se agreguen a la consulta. Si acabo de pasar City = "Boston", entonces quiero que se vea así:

SELECT * FROM PersonTable WHERE City = @city

Mi método de repo sería algo como esto

using Dapper; public List<PersonModel> Search(PersonModel model) { //db = DbConnection connection var selectSql = "SELECT * FROM PersonTable "; //build out where clause somehow return db.Query<PersonModel>(selectSql).ToList(); }

Mi pregunta es, ¿cómo podría construir esto en mi método de recompra correctamente?


Puede utilizar la biblioteca ExpressionExtensionSQL . Esta biblioteca convierte las expresiones lambda a cláusulas where, y puede usarse con dapper y ADO.


También puedes usar Dapper''s SqlBuilder

Aquí hay un ejemplo:

[Test] public void Test() { var model = new PersonModel {FirstName = "Bar", City = "New York"}; var builder = new SqlBuilder(); //note the ''where'' in-line comment is required, it is a replacement token var selector = builder.AddTemplate("select * from table /**where**/"); if (model.Id > 0) builder.Where("Id = @Id", new { model.Id }); if (!string.IsNullOrEmpty(model.FirstName)) builder.Where("FirstName = @FirstName", new { model.FirstName }); if (!string.IsNullOrEmpty(model.Lastname)) builder.Where("Lastname = @Lastname", new { model.Lastname }); if (!string.IsNullOrEmpty(model.City)) builder.Where("City = @City", new { model.City }); Assert.That(selector.RawSql, Is.EqualTo("select * from table WHERE FirstName = @FirstName AND City = @City/n")); //var rows = sqlConnection.Query(selector.RawSql, selector.Parameters); }

Puedes encontrar algunos ejemplos here!


bool isFirstWhereSet = false; bool isCityWhereSet = false; string sqlQuery = "SELECT * FROM PersonTable " ; if (! String.IsNullOrEmpty(model.FirstName )) { sqlQuery =sqlQuery + "WHERE FirstName =@FirstName" ; isFirstWhereSet = true; } if (! String.IsNullOrEmpty(model.City)) { isCityWhereSet = true ; if (! isFirstWhereSet ) sqlQuery = sqlQuery + " WHERE City = @city"; else sqlQuery = sqlQuery + " AND City = @city"; } if (isFirstWhereSet == true && isCityWhereSet == true ) return db.Query<PersonModel>(sqlQuery , new { FirstName = model.FirstName , City = mode.City}).ToList(); else if (isFirstWhereSet == true && isCityWhereSet == false) return db.Query<PersonModel>(sqlQuery , new { FirstName = model.FirstName }).ToList(); else if (isFirstWhereSet == false && isCityWhereSet == true) return db.Query<PersonModel>(sqlQuery , new { City= model.City}).ToList(); else { return db.Query<PersonModel>(sqlQuery).ToList(); }