2015-04-22 65 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的問題。 –