C# 如何动态创建简洁查询的参数

C# 如何动态创建简洁查询的参数,c#,.net,dapper,C#,.net,Dapper,我有一本价值观词典,例如“Name”:“Alex” 有没有办法把它作为查询的参数传递给Dapper 下面是一个例子,说明我想做什么 IDictionary<string, string> args = GetArgsFromSomewhere(); string query = "select * from people where Name = @Name"; var stuff = connection.Query<ExtractionRecord>(query, a

我有一本价值观词典,例如“Name”:“Alex”

有没有办法把它作为查询的参数传递给Dapper

下面是一个例子,说明我想做什么

IDictionary<string, string> args = GetArgsFromSomewhere();
string query = "select * from people where Name = @Name";
var stuff = connection.Query<ExtractionRecord>(query, args);
IDictionary args=getargsfromsomeone();
string query=“从Name=@Name的人员中选择*”;
var stuff=connection.Query(Query,args);
是:

然后通过
dbArgs
代替
args

var stuff = connection.Query<ExtractionRecord>(query, dbArgs);

我知道这是一个老问题(比如,5岁),但我也在为同样的问题而挣扎。完整的答案在对另一个答案的评论中,但我想我会在这里提供一个完整的例子

string query = "SELECT * FROM MyTableName WHERE Foo = @Foo AND Bar = @Bar";

Dictionary<string, object> dictionary = new Dictionary<string, object>();
dictionary.Add("@Foo", "foo");
dictionary.Add("@Bar", "bar");

var results = connection.Query<MyTableName>(query, new DynamicParameters(dictionary));
string query=“从MyTableName中选择*,其中Foo=@Foo和Bar=@Bar”;
字典=新字典();
添加(“@Foo”,“Foo”);
添加(“@Bar”、“Bar”);
var results=connection.Query(查询,新的动态参数(字典));
或者,为了完全动态,您可以创建如下方法,该方法将采用任何模型、任何查询和任何查询参数集:

    public static IEnumerable<T> Get<T>(string query, Dictionary<string, object> dictionary)
    {
        IEnumerable<T> entities = connection.Query<T>(query, new DynamicParameters(dictionary));
        return entities;
    }
公共静态IEnumerable Get(字符串查询、字典)
{
IEnumerable entities=connection.Query(查询,新的动态参数(字典));
返回实体;
}
然后调用此方法:

var results = Get<MyTable>(query, dictionary)
var results=Get(查询、字典)
长时间后编辑

这个答案继续得到支持,所以这显然仍然是一个需要。我采用了这个解决方案,并在Dapper的基础上创建了一个完整的数据访问NuGet包。它将CRUD和查询操作简化为一行代码


以下是。

您也可以使用
ExpandoObject
作为查询的参数,而不是特定于Dapper的类
DynamicParameters

ExpandoObject param = new ExpandoObject();

IDictionary<string, object> paramAsDict = param as IDictionary<string, object>;
paramAsDict.Add("foo", 42);
paramAsDict.Add("bar", "test");

MyRecord stuff = connection.Query<MyRecord>(query, param);
ExpandoObject参数=新的ExpandoObject();
IDictionary paramAsDict=作为IDictionary的参数;
paramAsDict.Add(“foo”,42);
paramAsDict.添加(“条”、“测试”);
MyRecord stuff=connection.Query(Query,param);

请注意,您可以使用
新的DynamicParameters(dictionary)
,它会很好地工作。@asgerhallas这在二月份可能不是真的,但是是的:您是对的-现在这当然是真的为了让新的DynamicParameters(dictionary)工作,dictionary必须是IEnumerable,例如dictionary。字典没用。
var results = Get<MyTable>(query, dictionary)
ExpandoObject param = new ExpandoObject();

IDictionary<string, object> paramAsDict = param as IDictionary<string, object>;
paramAsDict.Add("foo", 42);
paramAsDict.Add("bar", "test");

MyRecord stuff = connection.Query<MyRecord>(query, param);