如何检查Dapper QueryMultiple是否返回结果

时间:2015-06-21 22:59:50

标签: c# .net dapper

我有一个存储库方法,它接受可选参数,可能会也可能不会返回任何记录。如果查询返回记录一切正常,但如果没有结果,那么我会在Dapper中抛出异常。在连接或多个方法上似乎没有一个方法可以让我检查在尝试读取之前是否存在返回的结果集。有没有办法做到这一点,还是我做了一些不合逻辑的事情?

    public ICustomer GetCustomer(int? custId = null, string email = null, string phoneNumber = null)
    {
        using (var connection = GetConnection())
        {
            using (var multi = connection.QueryMultiple("BusinessEntity.usp_Customer_GetCustomer", 
            new { CustId = custId, Email = email, Phone = phoneNumber },
            commandType: CommandType.StoredProcedure))
            {
   Exception -> var customer = multi.Read<Customer>().SingleOrDefault();

                //customer.Address = multi.Read<Address>() as IList<IAddress>;
                //customer.Phone = multi.Read<Phone>() as IList<IPhone>;

                return customer;
            }
        }
    }

例外是

  

未选择任何列

        if (reader.FieldCount <= startBound)
        {
            throw MultiMapException(reader);
        }

1 个答案:

答案 0 :(得分:0)

这实际上是我的存储过程逻辑中的一个缺陷。我有条件地跳过我实际执行多个选择的部分,基于先前的客户ID查询。

ALTER PROCEDURE [BusinessEntity].[usp_Customer_GetCustomer]
   @CustId INT = NULL,
   @Email  VARCHAR(100) = NULL,
   @Phone  VARCHAR(100) = NULL
AS
 BEGIN TRAN;
 IF @CustId IS NULL
     BEGIN
         SELECT @CustId = c.CustomerId
        ...
     END;
         IF @@ROWCOUNT > 1 AND @Cust IS NOT NULL --Wrong
         IF @CustId IS NULL @CustId = 0 --Sort of correct
             BEGIN
                 SELECT ...
                 SELECT ...
                 SELECT ...
             END;
                 COMMIT;
                 RETURN 0;