在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();
   ...
} 

在Dapper Multiple Results中,当where子句依赖于第一个查询的结果时,如何使第二行查询工作?

这最终是一个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中测试,因此您可能必须根据您的需求进行更改。