gpt4 book ai didi

c# - 我的查询类。你的意见?

转载 作者:太空狗 更新时间:2023-10-29 21:48:06 25 4
gpt4 key购买 nike

我只是想分享这个查询类并了解您的想法。 Query 类有助于针对 dbconnection 执行查询。我没有包括实现,发布有点多。这是一个示例调用,您会明白的:

OrdersDataTable table = 
new Query(connection)
.Table("Orders")
.Fields("OrderID,CustomerID,Description,Amount")
.GreaterThan("OrderID", 1000)
.OrderBy("OrderID")
.Execute<OrdersDataTable>();

以下是我喜欢这门课的原因:

  • 无需编写 ADO.NET 命令代码。调用此类比等效的 ADO.NET 占用更少的行数。
  • 每个成员函数都返回 this,因此可以将多个调用链接在一起。我不确定这种模式是否有名称。你知道吗?
  • 处理 MySql、OleDb 和 SqlServer 方言。
  • 对我来说似乎比 ADO.NET 的可读性更好。
  • 调用顺序无关紧要。所有参数都缓冲在内部集合中,并在调用 Execute 时读取。
  • 我的场景要求我与多个数据库产品进行通信,因此我想以通用方式编写一次查询,然后只传递给定的连接。利用存储过程等特定于数据库的功能会很麻烦。

我有一个在内部使用此类的 DAL。 UI 将调用 DAL,传递一些查询参数并返回 DataTable。该类确实有助于减少 DAL 实现的 LOC 并使其更具可读性。

这是一个示例 DAL 调用:

OrdersDataTable orders = Orders.GetByOrderId( 1 )

和实现:

public static OrdersDataTable GetByOrderId( int id )
{
return
new Query(connection)
.Table("Orders")
.Fields("OrderID,CustomerID,Description,Amount")
.Equals("OrderID", id)
.Execute<OrdersDataTable>();
}

谢谢!

编辑:感谢大家的宝贵反馈。你们中的许多人建议使用 LinqToSql。我没有选择Linq,因为微软目前只支持Sql Server。我需要查询 Jet、MySql 和 Sql Server 表。

有人问AND和OR子句是怎么构造的。这里有一个例子

//and example
public static OrdersDataTable GetByOrderIdAndCustomerId( int orderId, int customerId )
{
return
new Query(connection)
.Table("Orders")
.Fields("OrderID,CustomerID,Description,Amount")
.Equals("OrderID", orderId)
.Equals("CustomerID", customerId)
.Execute<OrdersDataTable>();
}

//or example
public static OrdersDataTable GetByOrderIdOrCustomerId( int orderId, int customerId )
{
return
new Query(connection)
.Table("Orders")
.Fields("OrderID,CustomerID,Description,Amount")
.OrBegin
.Equals("OrderID", orderId)
.Equals("CustomerID", customerId)
.OrEnd
.Execute<OrdersDataTable>();
}

最佳答案

看起来您已经编写了一个非常漂亮的小 ORM(对象关系映射器),其中包含存储库(或接近)模式的实现。您还利用了称为 Fluent Interfaces 的设计模式,它允许您执行 .Table .Fields 之间的级联。

所有这 3 种模式都非常适合包含在现代软件系统设计中,因为您已经注意到它们大大减少了 LOC,增强了可维护性并大大提高了测试能力。我也很喜欢您构建的功能能够正确使用泛型返回强类型对象。

编辑:我能看到的唯一可能改进的领域是改变每个调用都是一个新查询的事实,并且可能更改您的代码以使用将注入(inject)正确提供程序的依赖项注入(inject)框架当对象被调用时,它将为查询启动一个数据库事务。如果您的代码已经在 Query 类内部完成了很多工作,可以称为“穷人的依赖注入(inject)”或至少它非常相似(取决于您的实现)如果它已经为您工作并且您不打算真正成长出你的数据库类型支持穷人的 DI 应该就好了。我只是不再喜欢 new 关键字的任何用法,因为它通常会导致 DI 框架减轻的高级别代码耦合(或者隐藏方法是一个糟糕的错误设计决策)。

作为对 Mark 回答的回应,我通常不喜欢代码生成,它似乎总是会成为一个失败点,但他确实有一个很好的观点来减少魔法字符串的数量涉及。不过,我会选择使用 Lambda 运算符和表达式来处理这个问题,这样您就可以实现:

public static OrdersDataTable GetByOrderId( int id )
{
return
new Query(connection)
.Table(x => Inflector.Pluralize(x.GetType())
.Fields(x=> { x.OrderID, x.CustomerID, x.Description, x.Amount })
.Equals(x=>x.OrderID, id)
.Execute<OrdersDataTable>();
}

这将消除所有魔术字符串重构问题,使您可以更轻松地利用 Microsoft 或 Resharper 的内置重构工具(当然,resharper 可以在重构过程中找到魔术字符串)。

Inflector 是一个免费的库(不记得它是否是 OSS),它包含处理文本的功能,Pluralize 方法将接受一个词并使其成为...复数,如果你猜不出来的话。这很有用的地方是当你有像 Story 的时候你不能只去 GetType() + "s"因为 Storys 不正确并且 Inflector 会正确地返回你 "Stories"。

关于c# - 我的查询类。你的意见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1255334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com