【问题标题】:Unable to figure out how to do Joins within IQueryable无法弄清楚如何在 IQueryable 中进行连接
【发布时间】:2010-08-25 14:49:38
【问题描述】:

这是我正在尝试的:

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”的例子。

我不想为映射文件中的所有复杂查询创建单独的条目,因此该文件中的联接将不起作用。

因为我使用的是 Fluent NHibernate,所以我没有使用“ICriteria”。我正在使用“IQueryable”。如何在“IQueryable”中连接多个表?

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

【问题讨论】:

  • nhibernate linq 提供程序可能还不支持此功能(不确定)。我可能会改用一个标准。

标签: nhibernate


【解决方案1】:

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

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

顺便说一下,ICriteria vs IQueryable 与 Fluent NHibernate 无关。 Criteria API 和 LINQ 是您可以通过它们创建查询的两个提供程序。 Fluent NHibernate 是执行配置的另一种方式。

【讨论】:

  • 这只是管理员内单个页面上的问题。感谢您的建议,在大多数情况下,这将是正确的举措。不幸的是,在我的情况下,它会导致更多问题,然后才能解决。它会导致我的其他页面从 SQL 服务器中提取过多的数据。这很糟糕,因为 SQL 不是 Localhost。我已经找到了我必须做的事情。我需要使用 ICriteria 并且在我正在使用的项目中设置 Fluent NHibernate 的方式没有声明,所以我不能轻易使用它。我正在努力将其添加为选项。感谢您的建议。
  • @Michael 抱歉,我不清楚。我的意思是将其设置为急切加载,以作为识别问题的一种方式。如果这可行,那么不,您不想总是急切加载,只有在需要时才加载。您可以在每个查询的基础上指定获取模式,但我不清楚为什么您不能使用条件 API。它与 FNH 无关。如果您有一个ISession 可以用来执行 LINQ 查询,您可以执行条件查询。
  • 我选择这个作为答案,因为预加载解决了大约 2/3 的问题。 ICriteria 不可用,因为它未在自定义 NHibernate 接口中列出。我将它添加到自定义 NHibernate 接口中,并且该选项变得可用。我能够通过使用 ICriteria 完全解决这个问题。感谢您给了我从不同角度看待它的想法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 1970-01-01
相关资源
最近更新 更多