![](/img/trans.png)
[英]How to return List<dynamic> with Dapper.NET ORM that can bindable?
[英]How to return dynamic types List<dynamic> with Dapper ORM
我已經使用 Dapper.net 一段時間了,它是一個非常好的 ORM 映射器,可以很好地與 .Net 動態類型配合使用。
但我注意到,當 Dapper 從數據庫中檢索數據時,它以DapperRow
類型返回。
有什么方法可以讓我以任何其他類型返回它,比如System.Dynamic.ExpandoObject
?
當然!
根據 dapper 文檔使用查詢方法並獲取您的動態:
dynamic account = conn.Query<dynamic>(@"
SELECT Name, Address, Country
FROM Account
WHERE Id = @Id", new { Id = Id }).FirstOrDefault();
Console.WriteLine(account.Name);
Console.WriteLine(account.Address);
Console.WriteLine(account.Country);
如您所見,您獲得了一個動態對象,並且您可以訪問其屬性,只要它們在查詢語句中定義良好。
如果你省略.FirstOrDefault()
你會得到一個IEnumerable<dynamic>
你可以用它做任何你想做的事情。
DapperRow
對象旨在在行之間共享大量狀態。 例如,如果您獲取 40 行,則列名等僅存儲一次。 如果我們使用ExpandoObject
,則需要按行進行配置。 因此,使用DapperRow
作為幕后實現細節是一種刻意提高效率的事情。
請注意,從dynamic
API 返回的對象也可以轉換為IDictionary<string,object>
。
但是,我願意支持支持此字典用法的其他類型 - ExpandoObject
就是其中之一。 所以是的,它可以改變為:
var rows = conn.Query<ExpandoObject>(...);
作品。 它只需要代碼來支持它,而該代碼目前不存在。 所以“不,但也許在未來的構建中”。
另請注意,您根本不需要使用DapperRow
... 更預期的場景是使用通用 API 來具體化您自己的類型。
我有這個問題,我是通過這種方式解決的!
Query()
函數返回一個動態集合,它實際上是Dapper.SqlMapper.DapperRow
對象類型。 Dapper.SqlMapper.DapperRow
是私有的。 我需要向 Dapper.SqlMapper.DapperRow 對象動態添加屬性,但這似乎不起作用。 因此,我想將Dapper.SqlMapper.DapperRow
轉換為ExpandoObject
。
我能夠構建這個通用的輔助方法,如下所示。
public class DapperHelpers
{
public static dynamic ToExpandoObject(object value)
{
IDictionary<string, object> dapperRowProperties = value as IDictionary<string, object>;
IDictionary<string, object> expando = new ExpandoObject();
foreach (KeyValuePair<string, object> property in dapperRowProperties)
expando.Add(property.Key, property.Value);
return expando as ExpandoObject;
}
}
然后你可以像這樣使用它:
IEnumerable<ExpandoObject> result =
db.SqlConn.Query(sqlScript)
.Select(x=> (ExpandoObject)ToExpandoObject(x));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.