为什么这个FluentNHibernate查询会加载所有内容?

时间:2012-06-16 12:31:44

标签: fluent-nhibernate

我有以下查询:

MyRepository.Query<MyObject>().SingleOrDefault(x => x.AProperty == aValue);

它返回正确的MyObject,但它开始花费越来越多的时间。当我查看SQL Server Profiler时,我看到它在数据库中加载了 all 我的MyObjects,方法是从数据库中为MyObject和相关对象选择一行和一行。当数据库增长时,对于非常简单的查询,这会变成成千上万的选择。

另一方面,这个查询:

Session.QueryOver<MyObject>().Where(x => x.AProperty == aValue).SingleOrDefault<MyObject>()

不会加载所有内容(它会创建一个select语句而不是数千个)。

为什么呢?有没有办法告诉Query不要加载所有内容?或者这就是Linq查询的工作原理?我问的原因是我有一个应用程序,其中所有查询都是使用Query进行的。将其更改为QueryOver需要一些工作。有什么想法吗?

一些细节:

  • 查询是NHibernate.Linq命名空间(NHibernate v 3.1.0.4000)的扩展方法
  • 我的FluentNHibernate版本是1.2.0.712
  • 我有这个约定:Conventions.Add(FluentNHibernate.Conventions.Helpers.DefaultLazy.Never());

1 个答案:

答案 0 :(得分:0)

看了这一天超过一天我终于意识到了这个问题。这真的很简单,但很难从问题中的信息中回答。如果其他人遇到同样的问题,这是正确的答案;

MyRepository有这样的方法;

public List<T> Query<T>() where T : DomainEntity
{
    using (var session = _sessionSource.CreateSession())
    {
        using (var transaction = session.BeginTransaction())
        {
            var result = session.Query<T>();
            transaction.Commit();
            return result.ToList();
        }
    }
}

这意味着我首先执行加载所有内容(使用session.Query<T>()),然后只查询结果(使用MyRepository.Query<MyObject>().SingleOrDefault(x => x.AProperty == aValue);

当然,非常糟糕。复制他人的代码并不总是很聪明......

如何避免它?只是不要查询查询。