- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我只是想分享这个查询类并了解您的想法。 Query 类有助于针对 dbconnection 执行查询。我没有包括实现,发布有点多。这是一个示例调用,您会明白的:
OrdersDataTable table =
new Query(connection)
.Table("Orders")
.Fields("OrderID,CustomerID,Description,Amount")
.GreaterThan("OrderID", 1000)
.OrderBy("OrderID")
.Execute<OrdersDataTable>();
以下是我喜欢这门课的原因:
我有一个在内部使用此类的 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/
我有三张 table 。表 A 有选项名称(即颜色、尺寸)。表 B 有选项值名称(即蓝色、红色、黑色等)。表C通过将选项名称id和选项名称值id放在一起来建立关系。 我的查询需要显示值和选项的名称,而
在mysql中,如何计算一行中的非空单元格?我只想计算某些列之间的单元格,比如第 3-10 列之间的单元格。不是所有的列...同样,仅在该行中。 最佳答案 如果你想这样做,只能在 sql 中使用名称而
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我正在为版本7.6进行Elasticsearch查询 我的查询是这样的: { "query": { "bool": { "should": [ {
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
是否可以编写一个查询来检查任一子查询(而不是一个子查询)是否正确? SELECT * FROM employees e WHERE NOT EXISTS (
我找到了很多关于我的问题的答案,但问题没有解决 我有表格,有数据,例如: Data 1 Data 2 Data 3
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
以下查询返回错误: 查询: SELECT Id, FirstName, LastName, OwnerId, PersonEmail FROM Account WHERE lower(PersonEm
我从 EditText 中获取了 String 值。以及提交查询的按钮。 String sql=editQuery.getText().toString();// SELECT * FROM empl
我有一个或多或少有效的查询(关于结果),但处理大约需要 45 秒。这对于在 GUI 中呈现数据来说肯定太长了。 所以我的需求是找到一个更快/更高效的查询(几毫秒左右会很好)我的数据表大约有 3000
这是我第一次使用 Stack Overflow,所以我希望我以正确的方式提出这个问题。 我有 2 个 SQL 查询,我正在尝试比较和识别缺失值,尽管我无法将 NULL 字段添加到第二个查询中以识别缺失
什么是动态 SQL 查询?何时需要使用动态 SQL 查询?我使用的是 SQL Server 2005。 最佳答案 这里有几篇文章: Introduction to Dynamic SQL Dynami
include "mysql.php"; $query= "SELECT ID,name,displayname,established,summary,searchlink,im
我有一个查询要“转换”为 mysql。这是查询: select top 5 * from (select id, firstName, lastName, sum(fileSize) as To
通过我的研究,我发现至少从 EF 4.1 开始,EF 查询上的 .ToString() 方法将返回要运行的 SQL。事实上,这对我来说非常有用,使用 Entity Framework 5 和 6。 但
我在构造查询来执行以下操作时遇到问题: 按activity_type_id过滤联系人,仅显示最近事件具有所需activity_type_id或为NULL(无事件)的联系人 表格结构如下: 一个联系人可
如何让我输入数据库的信息在输入数据 5 分钟后自行更新? 假设我有一张 table : +--+--+-----+ |id|ip|count| +--+--+-----+ |
我正在尝试搜索正好是 4 位数字的 ID,我知道我需要使用 LENGTH() 字符串函数,但找不到如何使用它的示例。我正在尝试以下(和其他变体)但它们不起作用。 SELECT max(car_id)
我有一个在 mysql 上运行良好的 sql 查询(查询 + 连接): select sum(pa.price) from user u , purchase pu , pack pa where (
我是一名优秀的程序员,十分优秀!