如何在传递模型时使用Dapper构建动态WHERE子句 [英] How do I build a dynamic Where clause with Dapper when passing in a model

查看:0
本文介绍了如何在传递模型时使用Dapper构建动态WHERE子句的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个示例模型,如下所示:

public class PersonModel
{
     public int Id {get; set;}
     public string FirstName {get; set;}
     public string Lastname {get; set;}
     public string City {get; set;}
}
在我的存储库中,我想创建一个Search方法,在其中传递我的模型--但并不是所有的字段都会被填充。我想创建一个WHERE AND AND,它基于模型中的字段是否已填充。如果该字段未填充,则我不想为其创建WHERE子句。

例如-如果我传入FirstName="Bob"和City="Boston",则我希望我的搜索如下所示:

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

因为我没有传入ID或LastName,所以我不希望将它们添加到查询中。如果我只是传入City="Boston",那么我希望它是这样的:

SELECT * FROM PersonTable WHERE City = @city

我的回购方法如下所示

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

我的问题是如何在我的回购方法中正确地构建它?

推荐答案

您也可以使用Dapper的SqlBuilder

请注意,您必须安装Dapper.SqlBuilderNuGet包,因为它不随Dapper的主分发一起提供。

举个例子:

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

        //var rows = sqlConnection.Query(selector.RawSql, selector.Parameters);
    }

您可以找到一些示例here

这篇关于如何在传递模型时使用Dapper构建动态WHERE子句的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆