0

我有以下查询:

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

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

另一方面,这个查询:

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

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

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

一些细节:

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

1 回答 1

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); .

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

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

于 2012-06-18T12:51:33.590 回答