在Dapper Multiple Results中,当where子句依赖于第一个查询的结果时,如何使第二行查询工作?
本文关键字:查询 何使第 工作 二行 结果 Dapper Results where 子句 第一个 依赖于 | 更新日期: 2023-09-27 18:13:44
获取客户及其相关订单和退货的列表示例:
var sql = @"select * from Customers
select * from Orders where CustomerId = (depends on first query)
select * from Returns where CustomerId = (depends on first query)";
using (var multi = connection.QueryMultiple(sql))
{
var customer = multi.Read<Customer>().ToList();
var orders = multi.Read<Order>().ToList();
var returns = multi.Read<Return>().ToList();
...
}
这最终是一个SQL问题。这里没有任何额外的或不同的dapper做的事情—如果您作为批处理发出多个选择,它们必须是有效的SQL。有几种方法可以做到这一点,包括:
- 本地sql变量(通常只有一行)
- 临时表或(更好)表变量
- 连接或子查询 等
如果您不能构造SQL来做您想做的事情,请考虑单独运行第一个查询。
Marc Gravell已经给了你一个提示,但除此之外,下面的代码可能会对你有所帮助。
假设你有这种类型的模型。
public class Customer
{
public int Id { get; set; }
public string Name { get; set; }
public List<Order> Orders { get; set; }
public List<Return> Returns { get; set; }
}
这是你的方法。
public List<Customer> GetCustomers()
{
var customerList = new List<Customer>();
string query = "SELECT Id, " +
"[Name] FROM Customers";
string subsetquery = @"select * from Orders where CustomerId = @Id;
select * from Returns where CustomerId = @Id";
customerList = _connection.Query<Customer>(query);
foreach (var item in customerList)
{
var oPara = new DynamicParameters();
oPara.Add("@Id", item.Id, dbType: DbType.Int32);
using (var multi = _connection.QueryMultiple(subsetquery, oPara, commandType: CommandType.Text))
{
item.orders = multi.Read<Order>();
item.returns = multi.Read<Return>();
}
}
return customerList;
}
注意:以上代码未在vs中测试,因此您可能必须根据您的需求进行更改。