我有一个类结构如下(伪代码):
CompanyName (id, name) // Other information about the company
IUsefulSearchField // A field that can appear at any depth in the below
IUsefulSearchField2 // A field that can appear at any depth in the below
BaseClass (id) // Some other values needed in class & This class will be inherited by everything below
Class1: BaseClass (IUsefulSearchField, CompanyName) // Extra values not in the search
Class2: BaseClass (IUsefulSearchField, IList<CompanyName>, IUsefulSearchField2) // Extra values not in the search
Class3: BaseClass (CompanyName, IUsefulSearchField2)
Class4: BaseClass (IList<IUsefulSearchField>)
上面重复了多个搜索字段(它们不能包含在基类中,因为子类中可能有一个或多个)
我需要搜索这些常见字段和公司名称,我还需要限制1个或多个派生类型,例如(伪代码)
SELECT Object.ID, Object.Type, Object.CompanyName, Object.UsefulSearchField1,
null AS Object.UsefuleSearchField2
FROM Class1 UNION ALL (SELECT Object.ID, Object.Type, Object.CompanyName,
Object.UsefulSearchField1, Object.UsefuleSearchField2
FROM Class2 Inner Join IList<RelationshipToGet Companies> ) etc….
WHERE Object.Type in ('Class1', 'Class2', 'Class4') AND CompanyName Like 'Peps%'
AND (UsefulSearchField1 = 'Bond' OR UsefulSearchField1 IS NULL) AND
(UsefulSearchField2 > 1000 OR UsefulSearchField2 IS NULL)
这些表每行包含+ 10m行,因此需要通过
来获取合理数量的数据我的问题是:我应该创建一个非规范化的索引视图和一个我查询的相关搜索对象,返回对象类型和ID,这样当用户点击搜索结果的编辑时我就可以重建对象 - 或 - 我应该为每个创建LINQ查询的各个部分的对象设置一个接口 - 我们目前正在这样做,并且它被证明非常慢,因为它似乎可以进行优化,以便只有搜索时存在的术语(即如果只选择了Class1,则不需要查询其他类
非常感谢花时间阅读,如果需要更多信息,将会附加
答案 0 :(得分:1)
这取决于您是否愿意维护搜索对象。性能方面,索引视图是最佳选择,任何DBA都会推荐该解决方案。但是Lucene.net从java移植到至少满足您的一些要求。关于lucene有一些blog series,tekpub有一个whole episode about searching。
我个人没有使用NHibernate搜索任何高级版本,所以我不确定它是否完全符合您的要求。不过值得一看。如果你想要我的推荐,那么索引视图。启动并运行起来很快!
编辑:我会选择全新的QueryOver api或Criteria。如果您使用的是“NHibernate Contrib”Linq提供商,您肯定会遇到一些限制。它只有80%兼容,但您可以使用Criteria和QueryOver做出惊人的事情。如果您阅读了ayendes帖子,您可以轻松地将其转换为QueryOver进行一些编译时间检查而不是魔术字符串,如果这困扰您。
答案 1 :(得分:0)
非常警惕nHibernate LINQ提供程序v1 - 有限的Join支持以及无数的bug - 支持许多LINQ操作。我们正在等待转移到nHIbernate v3,它有一个重写LINQ,使用表达式树。只是一个警告伴侣。