【问题标题】:Advanced query in DapperDapper 中的高级查询
【发布时间】:2016-10-26 14:39:03
【问题描述】:

我在 c# 对象中有以下对象结构

new [] {
    new SomeType {
       Id = XXX,
       SomeSubType = new []{z,y,x,w}
    }, 
    .
    .
    .
}

我正在尝试为 Dapper 创建类似于以下 sql 查询的内容。

SELECT *
FROM some_table, some_other_table
WHERE (X = XXX/*@Id*/ AND Y IN (z, y, x, w) /*@SomeSubType*/)
       OR (X = AND Y IN (....))
       OR (....)
       OR (....)
       ..... )

我可以根据对象动态创建查询,并为每个选项创建大量参数——但这很痛苦。

谁能想到更好的方法来做到这一点?也许是一个更好的查询来确保满足这两个条件?

【问题讨论】:

  • 也许您应该读取平面列表数据(从您的联接中)并在 C# 中对它们进行分组
  • 这其实是个不错的主意,我想这就是我要做的。
  • 我会说动态创建查询是最好的选择,但根据 X 和 Y 的类型,您可以像 X + ' ' + Y IN @Combined 那样组合它们,然后 @Combined 将是 stuff.SelectMany(i => i.SomSubType.Select(j => i.X + " " + j.Y)) 但那可能会导致查询效率低下。
  • 这是一个有趣的想法,但是 - 我的 id 是 int 并且将其转换为字符串可能会以不好的方式影响性能 - 至于创建动态查询 - 它可能比 @shyju 的选项更昂贵

标签: c# sql sql-server dapper


【解决方案1】:
【解决方案2】:

如果我理解正确,您有一个可能的 OR 过滤器列表,如下所示:

var filters = new SomeType[] {
    new SomeType { Id = ..., Subtypes = new []{z,y,x,w} }, 
    new SomeType { Id = ..., Subtypes = new []{z,y,x,w} }, 
    new SomeType { Id = ..., Subtypes = new []{z,y,x,w} }, ...
}

您可以使用DapperQueryBuilder轻松创建动态条件:

var query = cn.QueryBuilder($@"
    SELECT *
    FROM some_table, some_other_table
    /**where**/");

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

foreach (var filter in filters)
    query.Where($"X = {filter.Id} AND Y IN {filter.Subtypes}");

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

免责声明:我是这个库的作者之一

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2020-03-15
    • 2016-02-01
    • 2014-02-22
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多