如何在传递模型时使用Dapper构建动态WHERE子句 [英] How do I build a dynamic Where clause with Dapper when passing in a model
本文介绍了如何在传递模型时使用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屋!
查看全文