创建一个通用检索方法以返回1条记录

本文关键字:方法 检索 返回 记录 1条 一个 创建 | 更新日期: 2023-09-27 17:58:33

我正在处理一个代码示例,我只想听听他们对做事方式的一些看法。它们使用普通的旧ADO.NET。它们有一个名为Read的通用函数,可以带回1条记录。这是代码:

public static T Read<T>(string storedProcedure, Func<IDataReader, T> make, object[] parms = null)
{
   using (SqlConnection connection = new SqlConnection())
   {
      connection.ConnectionString = connectionString;
      using (SqlCommand command = new SqlCommand())
      {
         command.Connection = connection;
         command.CommandType = CommandType.StoredProcedure;
         command.CommandText = storedProcedure;
         command.SetParameters(parms);
         connection.Open();
         T t = default(T);
         var reader = command.ExecuteReader();
         if (reader.Read())
            t = make(reader);
         return t;
      }
   }
}

我不知道为什么:

  • 他们使用Func<IDataReader, T> make作为方法签名的一部分?这样做有效率吗?有更好的方法/最佳实践吗
  • 我不懂T t = default(T);?这样做有效率吗?有更好的方法/最佳实践吗
  • t = make(reader);做什么?这样做有效率吗?有更好的方法/最佳实践吗

调用函数看起来像这样:

public Customer GetCustomer(int customerId)
{
   // Other code here
   string storedProcedure = "MyStoredProcedure";
   object[] parameters = { "@CustomerId", customerId };
   return Db.Read(storedProcedure, Make, parameters);
}
private static Func<IDataReader, Customer> Make = reader =>
new Customer
{
   CustomerId = reader["CustomerId"].AsId(),
   Company = reader["CompanyName"].AsString(),
   City = reader["City"].AsString
};

我不理解Func Make部分?有人能向我解释一下这里发生了什么,以及这是否是好的做法吗。如有任何更改,我们将不胜感激,但请提供详细的示例代码:)

创建一个通用检索方法以返回1条记录

make(物化)的委托非常通用和灵活,但在绝大多数情况下,IMO会带来一些不必要的工作。就的作用而言-他们使用委托作为回调,让调用方指定如何读取记录。

请注意,由于他们不希望消费者更改记录,因此他们可能应该公开IDataRecord,而不是IDataReader(任何读取器也实现记录)。

请注意,如果在第一条记录之后的TDS流中有任何错误消息,所示的方法不会看到它们,但这是一种边缘情况。如果你想缓解这种情况,你可以读到TDS流的末尾:

while(reader.NextResult()) {}

不过,就我个人而言,我只想在这里使用dapper dot net——避免了手动编写每种类型的代码:

var cust = connection.Query<Customer>("MyStoredProcedure",
     new { CustomerId = customerId },
     commandType: CommandType.StoredProcedure).Single();

这将执行作为存储过程的MyStoredProcedure,传入带有customerId中的值的@CustomerId,然后应用直接列<===>属性/字段匹配以创建Customer记录,然后断言只有一个结果-并返回它。

他们使用Func-make作为方法签名的一部分?这样做有效率吗?有更好的方法/最佳实践吗?

由于方法的通用性,T是未知的,因此他们不知道如何将读取器映射回T属性。因此,他们将此责任留给方法的调用方。事实上,这已经足够有效了,而且是很好的实践。

我不明白t t=默认(t);?这样做有效率吗?有更好的方法/最佳实践吗?

因为T可以是值或引用类型,所以不能将其赋值为null。default(T)返回此类型的默认值。在引用类型的情况下,它将为null。如果是值类型,例如integer,它将为0。

t=做什么(读者);做这样做有效率吗?有更好的方法/最佳实践吗?

它调用传递的委托,并将结果分配给t