모델을 전달할 때 Dapper로 동적 Where 절을 작성하는 방법

.net c#-4.0 dapper sql

문제

다음과 같은 예제 모델이 있습니다.

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

내 저장소에서 내 모델에서 전달하는 검색 방법을 만들고 싶지만 모든 필드가 항상 채워지지는 않습니다. 모델의 필드가 채워지는 경우 또는 기반으로 WHERE 및 AND를 만들고 싶습니다. 필드가 채워지지 않으면 WHERE 절을 작성하지 않으려 고합니다.

예를 들어 - FirstName = "Bob"및 City = "Boston"을 전달하면 내 검색이 다음과 같이 표시됩니다.

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

Id 또는 성을 전달하지 않았으므로 이들을 쿼리에 추가하지 마십시오. City = "Boston"을 그냥 지나치면 다음과 같이 표시해야합니다.

SELECT * FROM PersonTable WHERE City = @city

내 repo 메소드는 다음과 같습니다.

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

내 질문은 어떻게 내 repo 메서드에서 제대로 구축 할 것이라고?

수락 된 답변

Dapper의 SqlBuilder를 사용할 수도 있습니다.

다음은 그 예입니다.

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

여기에 몇 가지 예를 찾을 수 있습니다 !


인기 답변

이것은 당신을 위해 트릭을 깨끗하고 간단하게해야합니다 :

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


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.