c# - 程序化地为 Dapper 创建一个动态对象

标签 c# sql-server tsql ado.net dapper

我看过很多关于创建 ExpandoObject 对象等的帖子,但它对我的情况不起作用。我需要创建一个像

这样的对象
var someObj = new {
    term1 = "someValue",
    term2 = "other",
    ...
};

基本上,我们使用 Dapper我们需要动态创建一个查询,其中 WHERE 子句是根据给定的参数数组构造的。我们一般化查询!这是一个接收可变数量参数的单一方法,我们需要检查 OR 单个列上的每个值。

目前,唯一可行的解​​决方案是还原并直接使用 System.Data.SqlClient.SqlConnection,或者有什么方法可以使它起作用吗?

更新:

这是最有可能应该工作但不工作的:

string inWhere = null;
dynamic inTerms = new ExpandoObject();
IDictionary<string, object> inTermsDict = inTerms;

if (!(string.IsNullOrEmpty(filter.Term) || string.IsNullOrWhiteSpace(filter.Term))) {
    inWhere = "(" + string.Join(" OR ", filter.Terms.Select((t, i) => "{0} LIKE @p" + i)) + ")";
    int termIndex = 0;
    foreach (string term in filter.Terms) {
        inTermsDict.Add("p" + (termIndex++), term);
    }
}

// ...

var rows = db.Query("SELECT * FROM {table} WHERE {baseCondition}" +
     (string.IsNullOrEmpty(inWhere) ? "" : string.Format(" AND " + inWhere, "columnName")),
     inTerms as object);

最佳答案

只是回答我自己的问题,因为我们今天早些时候找到了合适的解决方案。

简单地说,我们找到了 IDynamicParameters这个类简单地解决了所有问题,充当了一个Dictionary

var inTerms = new Dapper.DynamicParameters();

inTerms.Add("@p" + (termIndex++), somveValue);

大家都很开心!

关于c# - 程序化地为 Dapper 创建一个动态对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15483184/

相关文章:

c# - 如何避免在 .NET Windows 窗体中创建重复的窗体?

c# - Microsoft.AspNetCore.App - 版本控制/是否应该在非 ASP.NET 类库中引用它?

sql-server - Windows 无法在本地计算机上启动 SQL Server (MSSQLSERVER)...(错误代码 3417)

sql - 函数 OBJECT_ID 的第二个参数

sql-server-2005 - 如何在 T-SQL 中将 DateTime 转换为精度大于天的数字?

sql - 如何在 SQL 中保持滚动校验和?

c# - 使用 ASP.NET 清除缓存的最有效方法

c# - 在 AutoCAD (C#) 中从一组线创建实体 block

sql-server - 更新而不锁定在事务内

sql - 如何将多个pdf文件保存到sql server中的一个文件夹中