簡體   English   中英

如何返回動態類型列表<dynamic>使用 Dapper ORM

[英]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));

參考: dapper-dot-net 問題 166

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM