创建一个通用检索方法以返回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
部分?有人能向我解释一下这里发生了什么,以及这是否是好的做法吗。如有任何更改,我们将不胜感激,但请提供详细的示例代码:)
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
。