簡體   English   中英

使用Dapper映射超過5種類型

[英]Using Dapper to map more than 5 types

我目前正在構建一個將12個表連接在一起的SELECT查詢。 我一直在使用Dapper進行所有其他查詢,效果很好。 問題是,泛型方法只需要五個通用參數。

我之前修改過代碼以支持最多6個用於另一個查詢,但現在我真的不認為我應該破解6個更多級別的泛型。

有沒有辦法將dapper傳遞給一個類型數組,並將結果作為一個對象數組返回,如果必須的話我可以手動編譯?

我也可能以錯誤的方式接近問題! 任何幫助將不勝感激!

在我工作的一個項目中,我看到這樣的東西可以映射超過7種類型。 我們使用了Dapper 1.38:

connection.Query<TypeOfYourResult>
(
   queryString,
   new[]
   {
      typeof(TypeOfArgument1),
      typeof(TypeOfArgument2),
      ...,
      typeof(TypeOfArgumentN)
   },
   objects =>
   {
      TypeOfArgument1 arg1 = objects[0] as TypeOfArgument1;
      TypeOfArgument2 arg2 = objects[1] as TypeOfArgument2;
      ...
      TypeOfArgumentN argN = objects[N] as TypeOfArgumentN;

     // do your processing here, e.g. arg1.SomeField = arg2, etc.
     // also initialize your result

     var result = new TypeOfYourResult(...)

     return result;
   },
   parameters,
   splitOn: "arg1_ID,arg2_ID, ... ,argN_ID"
);

queryString是不言自明的。 splitOn參數說明Dapper應如何從SELECT語句中拆分列,以便可以將所有內容正確映射到對象, 您可以在此處閱讀

您可以使用動態查詢並在之后映射它。 像這樣的東西

var result = conn.Query<dynamic>(query).Select(x => new Tuple<Type1, Type2, Type3, Type4, Type5>( 
// type initialization here 
    new Type1(x.Property1,x.Property2),
    new Type2(x.Property3,x.Property4),
    new Type3(x.Property5,x.Property6) etc....));

編輯:使用相當大的結果集,另一個選項可能是使用多個查詢,然后使用網格閱讀器。 這可能對你有用。

這個例子取自小巧玲瓏的時代:

var sql = 
@"
select * from Customers where CustomerId = @id
select * from Orders where CustomerId = @id
select * from Returns where CustomerId = @id";

using (var multi = connection.QueryMultiple(sql, new {id=selectedId}))
{
   var customer = multi.Read<Customer>().Single();
   var orders = multi.Read<Order>().ToList();
   var returns = multi.Read<Return>().ToList();
   ...
} 

這已經很久以前得到了解答,但我想在這里補充兩分錢。 而不是手動修改Dapper的源代碼,為什么不用這些字段創建一個poco類並像表一樣使用您的查詢?

映射可以正常工作,我知道做類定義也很痛苦,但似乎比處理后來的Dapper更新更容易。

暫無
暫無

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

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