Dapper官方教程翻譯3:Dapper方法之Query
Query方法描述
Query方法也是一個擴展方法,可以被IDbConnection對象調用,可以執行查詢語句,並且映射到結果。
可以映射的類型:
- Anonymous(匿名類型 var)
- Strongly Typed(強類型)
- Multi-Mapping (One to One)(一對一映射)
- Multi-Mapping (One to Many)(一對多映射)
- Multi-Type(多類型)
Query方法可使用的參數
參數名 | 參數說明 |
sql | 數據庫語句 |
param | 查詢參數 |
transaction | 所使用的事務 |
buffered | 是否緩存 |
commandTimeout | 執行超時時間 |
commandType | 語句類型 |
示例:Query執行匿名類型
-
string sql = "SELECT TOP 10 * FROM OrderDetails";
-
-
using (var connection = new SqlCeConnection("Data Source=SqlCe_W3Schools.sdf"))
-
{
-
//使用var進行類型推斷
-
var orderDetail = connection.Query(sql).FirstOrDefault();
-
-
FiddleHelper.WriteTable(orderDetail);
-
}
示例:Query執行強類型查詢
-
string sql = "SELECT TOP 10 * FROM OrderDetails";
-
-
using (var connection = new SqlCeConnection("Data Source=SqlCe_W3Schools.sdf"))
-
{
-
var orderDetails = connection.Query<OrderDetail>(sql).ToList();
-
-
Console.WriteLine(orderDetails.Count);
-
-
FiddleHelper.WriteTable(orderDetails);
-
}
示例:執行一對一關系查詢
-
string sql = "SELECT * FROM Invoice AS A INNER JOIN InvoiceDetail AS B ON A.InvoiceID = B.InvoiceID;";
-
-
using (var connection = My.ConnectionFactory())
-
{
-
connection.Open();
-
-
var invoices = connection.Query<Invoice, InvoiceDetail, Invoice>(
-
sql,
-
(invoice, invoiceDetail) =>
-
{
-
invoice.InvoiceDetail = invoiceDetail;
-
return invoice;
-
},
-
splitOn: "InvoiceID")
-
.Distinct()
-
.ToList();
-
}
示例:執行一對多關系查詢
-
string sql = "SELECT TOP 10 * FROM Orders AS A INNER JOIN OrderDetails AS B ON A.OrderID = B.OrderID;";
-
-
using (var connection = new SqlCeConnection("Data Source=SqlCe_W3Schools.sdf"))
-
{
-
var orderDictionary = new Dictionary<int, Order>();
-
-
-
var list = connection.Query<Order, OrderDetail, Order>(
-
sql,
-
(order, orderDetail) =>
-
{
-
Order orderEntry;
-
-
if (!orderDictionary.TryGetValue(order.OrderID, out orderEntry))
-
{
-
orderEntry = order;
-
orderEntry.OrderDetails = new List<OrderDetail>();
-
orderDictionary.Add(orderEntry.OrderID, orderEntry);
-
}
-
-
orderEntry.OrderDetails.Add(orderDetail);
-
return orderEntry;
-
},
-
splitOn: "OrderID")
-
.Distinct()
-
.ToList();
-
-
Console.WriteLine(list.Count);
-
-
FiddleHelper.WriteTable(list);
-
FiddleHelper.WriteTable(list.First().OrderDetails);
-
}
示例:Query執行多類型
-
string sql = "SELECT * FROM Invoice;";
-
-
using (var connection = My.ConnectionFactory())
-
{
-
connection.Open();
-
-
var invoices = new List<Invoice>();
-
-
using (var reader = connection.ExecuteReader(sql))
-
{
-
var storeInvoiceParser = reader.GetRowParser<StoreInvoice>();
-
var webInvoiceParser = reader.GetRowParser<WebInvoice>();
-
-
while (reader.Read())
-
{
-
Invoice invoice;
-
-
switch ((InvoiceKind) reader.GetInt32(reader.GetOrdinal("Kind")))
-
{
-
case InvoiceKind.StoreInvoice:
-
invoice = storeInvoiceParser(reader);
-
break;
-
case InvoiceKind.WebInvoice:
-
invoice = webInvoiceParser(reader);
-
break;
-
default:
-
throw new Exception(ExceptionMessage.GeneralException);
-
}
-
-
invoices.Add(invoice);
-
}
-
}
-
-
My.Result.Show(invoices);
-
}