以下是我的尝试:
IQueryable query = this.MyRepository.GetShippingCollection();
IList<SomeListType> myList = query.Where(x => x.Settings
.Where(y => y.SelectorID.Equals(5))
.Count() > 0)
.OrderBy(x => x.Order)
.ToList();
产生此错误: 无法解析属性:Settings.ID
如果我这样做它可以工作,但在我的SQL Server上导致超过3,000个查询:
IList<SomeListType> myList = this.MyRepository.GetShippingCollection().ToList();
myList = myList.Where(x => x.Settings
.Where(y => y.SelectorID.Equals(5))
.Count() > 0)
.OrderBy(x => x.Order)
.ToList();
我知道解决方案在于使用“加入”。
我一直在查看过去几个小时的示例,并且只能在Mapping文件中找到Join示例。我也在寻找“ICriteria”的例子。
我不想在映射文件中为我的所有复杂查询创建seporate条目,因此该文件中的连接将不起作用。
由于我使用的是Fluent NHibernate,我没有使用“ICriteria”。我正在使用“IQueryable”。如何在“IQueryable”中加入多个表?
对此的任何帮助将不胜感激。 提前谢谢。
答案 0 :(得分:1)
如果第二个查询正在执行3,000个查询,则几乎肯定会延迟加载Settings
集合。当您遍历列表时,您将访问此集合,并且每次NHibernate返回数据库以获取它。 尝试将“设置”属性的提取模式设置为映射中的预先加载。
除此之外,LINQ提供商可能是一个问题。您使用的是什么版本的NHibernate? 2.x LINQ提供程序有一些实际限制。它已在3.0 trunk中重新实现,但您必须从源代码下载并编译它。
顺便说一句,ICriteria vs IQueryable与Fluent NHibernate无关。 Criteria API和LINQ是两个可以通过其创建查询的提供程序。流畅的NHibernate是一种执行配置的替代方法。