it-swarm.com.de

Wie erstelle ich eine dynamische Where-Klausel mit Dapper, wenn Sie ein Modell übergeben

Ich habe ein Beispielmodell, das so aussieht:

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

In meinem Repository möchte ich eine Suchmethode erstellen, bei der ich mein Modell übergebe - aber nicht alle Felder werden immer ausgefüllt. Ich möchte ein WHERE und AND erstellen, basierend darauf, ob ein Feld im Modell gefüllt ist oder nicht. Wenn das Feld nicht ausgefüllt ist, möchte ich keine WHERE-Klausel dafür erstellen.

Wenn ich beispielsweise FirstName = "Bob" und City = "Boston" übergebe, möchte ich, dass meine Suche folgendermaßen aussieht:

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

Da ich Id oder LastName nicht übergeben habe, möchte ich nicht, dass sie der Abfrage hinzugefügt werden. Wenn ich nur City = "Boston" passiere, dann möchte ich, dass es so aussieht:

SELECT * FROM PersonTable WHERE City = @city

Meine Repo-Methode würde ungefähr so ​​aussehen

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

Meine Frage ist, wie würde ich das in meiner Repo-Methode richtig ausbauen?

19
Eldorian

Sie können auch Dappers SqlBuilder verwenden.

Hier ist ein Beispiel:

    [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);
    }

Einige Beispiele finden Sie hier: !

44
Void Ray

Dies sollte den Trick für Sie tun, einfach und sauber:

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

Sie können die Bibliothek ExpressionExtensionSQL verwenden. Diese Bibliothek konvertiert Lambda-Ausdrücke in where-Klauseln und kann mit dapper und ADO verwendet werden.

0
Felipe Spinelli
bool isFirstWhereSet = false;
bool isCityWhereSet = false;
string sqlQuery = "SELECT * FROM PersonTable "  ;
if (! String.IsNullOrEmpty(model.FirstName ))
{
sqlQuery  =sqlQuery  + "WHERE FirstName [email protected]" ;
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();
}
0
FakeisMe