【问题标题】:Dapper query on arbitrary properties对任意属性的 Dapper 查询
【发布时间】:2018-12-25 02:04:42
【问题描述】:

我正在开发一个测试 Dapper 项目,但遇到了一个我不太明白的用例。对于用户存储库,我有一个运行良好的 GetById 方法:

public static IEnumerable<User> GetById(IDbConnection connection, string identity)
    {
        string query = "SELECT * FROM USERS.USERINFO WHERE Id = @Id";
        return connection.Query<User>(query, new User { Id = identity });
    }

但我还希望能够通过任意属性或一组属性来查询我的用户。这可能吗?我想过简单地动态构建 SQL 查询字符串,但想知道 Dapper 是否提供类似的东西?

我采取的另一种方法是使用 IEnumerable Where 方法进行查询,但我猜这效率很低:

public static IEnumerable<User> Search(IDbConnection connection, Func<User, bool> predicate)
    {
        string query = "SELECT * FROM USERS.USER_INFO";
        return connection.Query<User>(query).Where(predicate);
    }

对如何实现任意过滤器/搜索方法有任何想法吗?

谢谢!

【问题讨论】:

    标签: dapper


    【解决方案1】:

    您可以使用SqlBuilder并动态添加更多Where子句:

     const string sqlTemplate = "SELECT * FROM USERS.USERINFO /**where**/";
    
     var sqlBuilder = new SqlBuilder();
     var template = sqlBuilder.AddTemplate(sqlTemplate);
    
     sqlBuilder.Select("*").Where("Id = @Id", new { Id = id });
    
     return connection.Query<User>(query);
    

    【讨论】:

    • 您可以直接在 Where 子句中添加参数,例如:new { Id = id }。如果您有一个动态属性列表,您可以使用列名和列值遍历字典,以便您可以添加基于字典的添加“where”子句。此外,如果您愿意,您可以创建一个包含所有参数的对象,例如: var parameters= new {Id = id, Column2 = Value 2, ... } 然后通过 sqlBuilder.AddParameters(parameters);
    猜你喜欢
    • 2013-10-31
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多