2012-06-16 34 views
0

我有以下查询:为什么这个FluentNHibernate查询加载所有内容?

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

它返回正确的MyObject的,但它已经开始采取越来越多的时间。当我用SQL Server Profiler查看时,通过从数据库中为MyObject和相关对象选择一行和一行,我发现它将数据库中的MyObjects加载全部。当数据库增长时,这变成了成千上万的选择用于相当简单的查询。

在另一方面,这个查询:

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

不加载的一切(它创建一个SELECT语句,而不是千人)。

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

一些细节:

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

回答

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

可怕地糟糕,当然,复制别人的代码并不总是智能...

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

+0

我很尴尬...... :) – Halvard