Fluent nhibernate 使用LINQ使用fluent nHibernate进行搜索,其中属性可能位于派生类中的多个位置

Fluent nhibernate 使用LINQ使用fluent nHibernate进行搜索,其中属性可能位于派生类中的多个位置,fluent-nhibernate,linq-to-nhibernate,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

我有一个类结构,如下伪代码所示:

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


非常感谢您花时间阅读,如果需要更多信息,我们将附加此信息。这取决于您是否愿意维护搜索对象。就性能而言,索引视图是最佳选择,任何DBA都会推荐该解决方案。然而,它是从java移植来的,至少可以满足您的一些需求。有一些关于lucene的文章,有一些是关于lucene的

就我个人而言,我没有使用NHibernate搜索任何先进的,所以我不确定它将完全满足您的要求。不过,这可能值得一看。如果您需要我的推荐,请访问索引视图。站起来跑起来真是太快了


编辑:我会选择全新的QueryOverAPI或标准。如果使用NHibernate Contrib Linq提供程序,您肯定会遇到一些限制。它只有80%的兼容性,但你可以用和QueryOver做令人惊奇的事情。若你们读了ayendes的文章,你们可以很容易地把它转换成QueryOver,进行一些编译时检查,而不是神奇的字符串,若这让你们感到困扰的话

非常小心nHibernate LINQ提供程序v1-有限的连接支持,以及无数的bug-支持许多LINQ操作。我们正在等待转移到NHibernateV3,它有一个使用表达式树重新编写的LINQ。只是一个警告

谢谢你的迅速回复。这一层进入企业搜索系统,但我们需要能够找到尚未编制索引的对象。由于数据的插补方式,这就导致了这一领域的额外复杂性。是否有人使用linq执行过如此复杂的查询?更新了更多信息,但不确定linq。来自NH Contrib的Linq提供商在搜索方面没有那么强大。感谢您明天将观看视频并回来报道-必须爱TekPub