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);
}
继续阅读与本文标签相同的文章
下一篇 :
【极客最新】三十六式教你玩转推荐系统教程
-
源码分析 RocketMQ DLedger(多副本) 之日志追加流程
2026-05-18栏目: 教程
-
Java描述设计模式(07):适配器模式
2026-05-18栏目: 教程
-
前端进阶|第十天 数组分组编程,区间还是连续一网打尽
2026-05-18栏目: 教程
-
深入理解Java线程状态
2026-05-18栏目: 教程
-
从SpringBoot构建十万博文聊聊限流特技
2026-05-18栏目: 教程
