使用Dapper映射超過5種類型

c# dapper sql

我目前正在構建一個將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();
   ...
} 


許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因