我正在調查使用Dapper並在LinqPad中嘗試過(你需要提供自己的連接字符串並設置一個'Ticket'表來實際運行這個):不明白從Dapper動態查詢結果內LinqPad
using (var conn = new SqlConnection(builder.ToString()))
{
conn.Open();
var loadSql =
@"Insert into Ticket(StatusKey, Status, ContactFirstName, ContactPhoneNumber, WorkflowKey)
Values (@statusKey, @status, @first, @phoneNumber, @key)";
var values = new[]
{
new { statusKey = "O", status = "Open", first = "Bob", phoneNumber = "6855551425", key = "std" },
new { statusKey = "R", status = "Researching", first = "Sue", phoneNumber = "77785552136", key = "exp" },
new { statusKey = "OD", status = "Overdue", first = "Ted", phoneNumber = "6795551496", key = "std" },
new { statusKey = "C", status = "Closed", first = "Mark", phoneNumber = "9945552678", key = "std" }
};
"Rows Added".Dump();
conn.Execute(loadSql, values).Dump();
"".Dump();
// Using <dynamic> returns same results
var tickets = conn.Query("Select Status, ContactFirstName, ContactPhoneNumber From Ticket").ToList();
"Tickets Found".Dump();
tickets.Count().Dump();
"".Dump();
"Attempt to get first ticket".Dump();
var firstTicket = tickets[0];
firstTicket.Dump();
(firstTicket ?? "first ticket is null").Dump();
"--- End First Ticket Attempt ---".Dump();
"".Dump();
"Access items returned by query".Dump();
tickets.ForEach(ticketObj =>
{
// ticketObj isn't null, but it not there either??
" Try to dump enumerated ticket".Dump();
if(ticketObj == null) " is null".Dump();
ticketObj.Dump();
//ticketObj.GetType().Dump(); // Null ref exception?
" --- End Enumeration Dump ---".Dump();
// Have to cast to dictionary
var ticket = (IDictionary<string,object>)ticketObj;
string.Format(" {0}: {1} at {2}", ticket["Status"], ticket["ContactFirstName"], ticket["ContactPhoneNumber"]).Dump();
"".Dump();
});
"--- End Access Test ---".Dump();
"".Dump();
conn.Execute("Truncate table ticket");
}
我得到以下結果:
Rows Added
4
Tickets Found
4
Attempt to get first ticket
--- End First Ticket Attempt ---
Access items returned by query
Try to dump enumerated ticket
--- End Enumeration Dump ---
Open: Bob at 6855551425
Try to dump enumerated ticket
--- End Enumeration Dump ---
Researching: Sue at 77785552136
Try to dump enumerated ticket
--- End Enumeration Dump ---
Overdue: Ted at 6795551496
Try to dump enumerated ticket
--- End Enumeration Dump ---
Closed: Mark at 9945552678
--- End Access Test ---
正如你所看到的,下面是怪異:
- 它讓我訪問第一個項目,但它不會轉儲並且不爲空(??),並且有四個項目被返回。
- 當我列舉,如果我投到一個IDictionary <字符串,對象>,它的工作原理。但是枚舉的實際項目(ticketObj)仍然不爲空,但我無法轉儲它。如果我嘗試獲取它的類型,我會得到一個空引用異常。
如果我還使用通用查詢<動態>版本,結果也是一樣的。
我認爲這裏應該是expandos的動態效果,我可以做類似
ticketObj.Status.Dump();
即查詢中的字段將變成由Query返回的每個對象的屬性。我錯過了什麼?這是Dapper的動態特性是如何工作的?或者,也許LinqPad不適用於動態對象?
感謝您的優秀的解釋! –