2015-04-22 64 views
3

我有这个类:小巧玲珑的建筑参数列表

public class Parameters 
{ 
    public string UserId {get;set;} 
    public string OrgId {get;set;} 
    public string Roles {get;set;} 
} 

它从一个JSON字符串deserialised。所以一些属性是null

什么是建立params列表传递给Dapper的最佳方法。

目前我建立了PARAMS字符串对SQL语句的结束标记的逻辑是这样的:

var parameters = string.Empty; 
var parametersObj = new { }; 
if (query.Parameters != null) 
{ 
    if (!string.IsNullOrWhiteSpace(query.Parameters.UserId)) 
    { 
     parameters = string.Format("{0} UserId = @UserId", parameters); 
     // parametersObj.UserId = 
    } 

    if (!string.IsNullOrWhiteSpace(query.Parameters.OrganisationIdentifier)) 
    { 
     parameters = string.Format("{0}, OrganisationIdentifier = @OrganisationIdentifier", parameters); 
    } 

    if (!string.IsNullOrWhiteSpace(query.Parameters.Roles)) 
    { 
     parameters = string.Format("{0}, Roles = @Roles", parameters); 
    } 
} 

var sqlString = string.Format("exec {0} {1}", query.DbObjectName, parameters); 

conn.QueryAsync<dynamic>(sqlString,) 

你可以用parametersObj我用的JavaScript方式去看看动态构建一个对象。如果我确实是用dynamic而不是一个对象来做这件事 - 它还能工作吗?

例如:

var parameters = string.Empty; 
dynamic parametersObj = new { }; 
if (query.Parameters != null) 
{ 
    if (!string.IsNullOrWhiteSpace(query.Parameters.UserId)) 
    { 
     parameters = string.Format("{0} UserId = @UserId", parameters); 
     parametersObj.UserId = query.Parameters.UserId; 
    } 

    if (!string.IsNullOrWhiteSpace(query.Parameters.OrganisationIdentifier)) 
    { 
     parameters = string.Format("{0} OrganisationIdentifier = @OrganisationIdentifier ", parameters); 
     parametersObj.OrganisationIdentifier= query.Parameters.OrganisationIdentifier; 
    } 

    if (!string.IsNullOrWhiteSpace(query.Parameters.Roles)) 
    { 
     parameters = string.Format("{0} Roles = @Roles", parameters); 
     parametersObj.Roles= query.Parameters.Roles; 
    } 
} 

var sqlString = string.Format("exec {0} {1}", query.DbObjectName, parameters); 

conn.QueryAsync<dynamic>(sqlString, parametersObj); 

回答

2

我认为第二个示例将工作当您更改

dynamic parametersObj = new {}; 

dynamic parametersObj = new ExpandoObject(); 

和查询

conn.QueryAsync(sqlString, new 
{ 
    UserId = parametersObj.UserId, 
    ... 
}; 

注:在动态对象填充像

conn.QueryAsync(sqlString, parametersObj); 

会引发错误

扩展方法不能动态地调度

+0

是的,我最终到了那里,确实使用了这个解决方案 - 因为我的初始规格发生了变化。但你是对的我认为 –

2

你不需要做任何事:刚通过你的对象作为参数。 Dapper只会传递它在查询中可以识别的属性/参数,即使它们全部通过:它也可以理解为null。

对象没问题。

...QueryAsync(sql, query.Parameters)... 
+0

'query.Parameters'是一个'IEnumerable <>'类,它是'public class Parameter {public string Name {get; set;} public string Type {get; set;} public string Value {get ; set;}'并从'JSON'反序列化。所以它不太适合我期望的'QueryAsync'要求的结构? –

+0

@CallumLinington那么'query.Parameters.UserId'是如何理解的? –

+0

自从我发布该问题以来,我改变了模型。所以我想用新的模式是行不通的。我还有一个关于我将发布的Dapper和Unit Testing的问题。 –