![](/img/trans.png)
[英]Dapper Multimapping with more than 7 types mapped, System.ArgumentException
[英]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.