使用LINQ搜索流畅的nHibernate,其中属性可能位于派生类中的数字位置

时间:2010-08-23 16:36:55

标签: fluent-nhibernate linq-to-nhibernate

我有一个类结构如下(伪代码):

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,则不需要查询其他类

非常感谢花时间阅读,如果需要更多信息,将会附加

2 个答案:

答案 0 :(得分:1)

这取决于您是否愿意维护搜索对象。性能方面,索引视图是最佳选择,任何DBA都会推荐该解决方案。但是Lucene.net从java移植到至少满足您的一些要求。关于lucene有一些blog seriestekpub有一个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,使用表达式树。只是一个警告伴侣。