我不确定什么是设计我称之为“参数化”搜索或规则引擎的最佳方法。我有一个Java对象,它有几个字段。我将针对多个查询运行java对象,以查看它是否符合特定条件。
我能想到的一个例子是bugzilla中的错误搜索功能。在UI中,您可以选择“状态”,“分辨率”,“严重性”等内容。然后点击go,它返回符合该条件的错误。我想这是通过从UI中选择的字段生成SQL查询来实现的。
在我的情况下,包含值的对象不在数据库中,所以这不是明显的答案。我的对象也相当复杂,需要添加多个表...而且创建数据库表只是为了在数据库中使用查询引擎,这似乎有些蠢。此外,在我的应用程序中,用户基本上创建了这些映射,并且需要将它们保存到数据库中。所以,在这种情况下,你最终会将一个原始的sql查询字符串保存到数据库,这对我来说听起来像一个严重的安全。 (但是,我不是一个数据库人,所以也许这就是事情的完成方式)。
此时,我真的在寻找一些指导。我希望有一些类型的设计模式用于我想要完成的任务。我尝试使用谷歌搜索各种东西,如“参数搜索设计模式”和“规则引擎”,并没有发现任何相关的东西。这是LINQ会解决的问题吗?我简单地看了一遍,看起来这也有点矫枉过正。
提前致谢。
编辑1:
这里有一些额外的细节,我希望到目前为止澄清这些评论。
我想让用户创建一些规则,就像对象foo.getTemperature()是> = 30和foo.getTypeOfMsg()== Alert。然后,检索“警报”设置对象。如果foo.getTypeOfMsg()==“Test”,则获取“Test”对象。规则是用户驱动的,因此有无限的可能性。对象foo由webservice检索,我不需要将它存储在数据库中。
答案 0 :(得分:2)
如果您没有使用DB来存储对象,除了“生成SQL查询”部分之外,其他所有内容都是相同的。你应该看看Specification Pattern。您的规范对象基本上有一个名为IsSatisfiedBy的方法,它接受对象以查看它是否符合规范。根据用户输入在规范中添加某种参数似乎是一项非常简单的练习,听起来就像在你的情况下一样。
我不确定我是否理解有关“映射”的部分,但由于您没有生成原始SQL查询,因此请确保您的规范对象是可序列化的,并且可以随心所欲地保留它。
LINQ可以像普通的C#或Java那样做。
答案 1 :(得分:0)
您是否正在尝试制作数据驱动的解决方案,可由用户或其他人任意修改,或者您正在寻找内部驱动的内容。
用户驱动的解决方案具有无限的可能性,这些可能性在构建时是未知的,但它需要某种UI。您必须将解决方案绑定到UI(例如,显示一个表并允许它们单击以对给定的行/行进行排序,并且可能让它们每行输入“Filter Criteria”)所以我不确定您的搜索有什么优势会提供..
内部驱动的解决方案具有固定数量的可能性,这些可能性在构建时都是已知的。您可以非常轻松地编写每个代码 - 可能不像您描述的那样容易编写代码,但不是太困难,因为您必须实现有限数量的解决方案。