无法弄清楚如何在IQueryable中进行联接

时间:2010-08-25 14:49:38

标签: nhibernate

以下是我的尝试:

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”中加入多个表?

对此的任何帮助将不胜感激。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

如果第二个查询正在执行3,000个查询,则几乎肯定会延迟加载Settings集合。当您遍历列表时,您将访问此集合,并且每次NHibernate返回数据库以获取它。 尝试将“设置”属性的提取模式设置为映射中的预先加载。

除此之外,LINQ提供商可能是一个问题。您使用的是什么版本的NHibernate? 2.x LINQ提供程序有一些实际限制。它已在3.0 trunk中重新实现,但您必须从源代码下载并编译它。

顺便说一句,ICriteria vs IQueryable与Fluent NHibernate无关。 Criteria API和LINQ是两个可以通过其创建查询的提供程序。流畅的NHibernate是一种执行配置的替代方法。