c# - 如何使用具有多个属性的集合在 Dapper 中进行过滤?

标签 c# .net-core dapper

我对 Dapper 有点陌生,我正在尝试寻找一种干净的方法来将过滤器参数传递给具有多个属性的集合的 SQL 查询。

我的收藏看起来像这样:

[{
    Prop1: 'A Value 1',
    Prop2: 'B Value 1'
},
{
    Prop1: 'A Value 2',
    Prop2: 'B Value 2'
}]

这应该导致 SQL 查询看起来像这样:

select *
from SampleTable
where
([ColumnA]='A Value 1' and [ColumnB]='B Value 1')
or ([ColumnA]='A Value 2' and [ColumnB]='B Value 2')

注意:如下所示的内容将不起作用,因为 PropA 和 PropB 这两个属性需要一起过滤。

string query = @"select *
                from SampleTable
                where [ColumnA] in (@PropA_Value)
                and [ColumnB] in (@PropB_Value)"

con.Query<T>(query, new{PropA_Value = PropA,PropB_Value = PropB}).AsList();

最佳答案

将您的过滤器建模为一个类:

class MyFilterDefinition
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}

使用 DapperQueryBuilder 构建动态条件 就这么简单:

var myOptions = new List<MyFilterDefinition>()
{
    new MyFilterDefinition() { Prop1 = "A Value 1", Prop2 = "B Value 1" },
    new MyFilterDefinition() { Prop1 = "A Value 2", Prop2 = "B Value 2" }
}

var query = cn.QueryBuilder($@"
    select *
    from SampleTable
    /**where**/");

// by default multiple filters are combined with AND, so change to OR
query.FiltersType = Filters.FiltersType.OR; 

foreach (var option in myOptions)
    query.Where($"[ColumnA] = {option.Prop1} AND [ColumnB] = {option.Prop2}");

var results = query.Query<YourPOCO>();

最终结果是这样的:

    select *
    from SampleTable
    where ([ColumnA]=@p0 AND [ColumnB]=@p1) OR ([ColumnA]=@p2 AND [ColumnB]=@p3)

用相应的参数@p0 = 'A Value 1' 等。

免责声明:我是 DapperQueryBuilder 的作者

关于c# - 如何使用具有多个属性的集合在 Dapper 中进行过滤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46839690/

相关文章:

c# - NullReferenceException 和我不知道为什么

.net-core - 在 MySQL 上调用存储过程时在 EF Core 上发生转换错误(使用 Pomelo)

sql-update - 使用 Dapper.Contrib Update,以及具有特殊帮助器属性的类

dapper - 用于 varchar 的 DbString、IsFixedLength 和 IsAnsi

c# - 无效操作异常 : No columns were selected when performing a DELETE query

c# - 是否可以在 Visual Studio 中编译之前立即添加 C# 类

c# - Windows Media Player的BackgroundWorker进程

.net-core - 轨道交通。编辑 MessageType 属性以删除不必要的项目

c# - 如何使用c#将数据添加到mysql中的指定列

.net - 已使用 '.NETFramework,Version=v4.6.1'而不是项目目标框架'恢复了